2010-03-02 2 views
35
public interface IInterface1 
{ 
} 

public interface IInterface2 
{ 
} 

public class MyClass : IInterface1, IInterface2 
{ 
} 

... 

ObjectFactory.Initialize(x => 
{ 
    x.For<IInterface1>().Singleton().Use<MyClass>(); 
    x.For<IInterface2>().Singleton().Use<MyClass>(); 
}); 

var x = ObjectFactory.GetInstance<IInterface1>(); 
var y = ObjectFactory.GetInstance<IInterface2>(); 

위 코드로 두 개의 다른 MyClass 인스턴스를 얻습니다. 어떻게 하나를 얻을 수 있습니까?StructureMap 싱글 톤 사용 (두 인터페이스를 구현하는 클래스)

답변

51

당신은 다른 유형의 해상도를 사용하여 유형을 해결하기 위해 StructureMap에게 전달 <>() 등록을 사용할 수 있습니다.

ObjectFactory.Initialize(x => 
{ 
    x.For<IInterface1>().Singleton().Use<MyClass>(); 
    x.Forward<IInterface1, IInterface2>(); 
}); 
+0

aaaawesome. 정확히 내가 무엇을 찾고 있었는지. 고맙습니다 – GR7

-4

ObjectFactory은이고 복수 인스턴스를 생성하려면 입니다. 싱글 톤을 원한다면 싱글 톤 클래스를 작성하십시오 (접근 자로서 public IInterface1IInterface2 속성이있는 경우도 있음).

스케치로 기록되어 있지만 아마도 Container을 사용할 수 있습니다.

+9

컨테이너 (ObjectFactory 또는 수동으로 생성 된 컨테이너)는 사용자의 싱글 톤 동작을 직접 구현할 필요가 없으므로 객체 라이프 사이클을 처리 할 수 ​​있습니다. –

1

다양한 과부하를 사용하여 특히 Func 과부하를 살펴보십시오. 거기에서 이미 등록 된 다른 객체로 StructureMap이 인스턴스를 생성하는 방법을 알 수 있습니다.

12

MyClass 자체를 등록한 다음 개별 인터페이스의 Use 문에 대해 컨텍스트 밖으로 가져옵니다.

ForSingletonOf<MyClass>().Use<MyClass>(); 

For<IInterface1>().Use(ctx => ctx.GetInstance<MyClass>()); 
For<IInterface2>().Use(ctx => ctx.GetInstance<MyClass>()); 
+1

이것이 나를 위해 일한 것입니다! "x.Forward"메서드가 작동하지 않아 내 코드가 IInterface2를 해결할 수 없습니다. – andyhammar

+3

@andyhammer 두 개의 인터페이스를 바꿨을 수도 있습니다. FROM이 가장 먼저, TO가 두 번째입니다. 나는 그 실수를했다. ... 좋은 해결책은, 내가 나쁜 디자인을 가졌고, 가능하지 않다라고 생각하고 있었다. 그러나 나는 다른 것이 같은 이슈를 가지고 있다고 생각한다, 신에게 감사해라. – Syska

+0

나는이 접근법이 더 깨끗하다고 ​​생각한다. 나는이 인터페이스들을 서로 연결하는 것을 좋아하지 않는다. –