2011-08-23 5 views
1

해당 형식을 요청할 때 호출되는 팩터 리 대리자가있는 형식을 Autofac에 등록하는 방법이 있습니까? 이 같은 뭔가 : 이것은 확실히 당신이 예상 아마도,하지만 트릭을 수행합니까팩토리 대리자가있는 레지스터 유형

builder.RegisterType<MyType>().AsSelf() 
     .WithFactory((IMyService s, ISomeDependency d) => 
        { 
         var p1 = s.DoSomething(); 
         var p2 = d.DoSomething(p1, true); 
         return new MyType(p1, p2); 
        }); 
+0

Autofac에서 해당 대리인을 호출하고 해당 호출에'IMyService'와'ISomeDependency'를 삽입 하시겠습니까? – Steven

+0

@Steven : 정확히 –

답변

2

:

builder.Register<MyType>(container => 
{ 
    var s = container.Resolve<IMyService>(); 
    var d = container.Resolve<ISomeDependency>(); 

    var p1 = s.DoSomething(); 
    var p2 = d.DoSomething(p1, true); 
    return new MyType(p1, p2); 
}); 

또는 자동 (생성자) 주입을 사용하려는 경우, 당신은 MyType을 만들 수 있습니다 하위 클래스 (Composition Root)에는 두 가지 종속성이 있습니다. 이 타입은 쉽게 등록 될 수 있습니다 :

builder.RegisterType<AutofacMyType().As<MyType>(); 

// Define inside Composition Root 
private sealed class AutofacMyType : MyType 
{ 
    public AutofacMyType(IMyService s, ISomeDependency d) 
     : this(s.DoSomething(), d) { } 

    private AutofacMyType(Something p1, ISomeDependency d) 
     : base(p1, d.DoSomething(p1, true)) { } 
} 
+0

그게 내가 지금 사용하고있는 것이고, 내가 의존성을 해결해야하기 때문에 나는 그것을 좋아하지 않는다 ... –

+0

두 번째 것은 좋은 아이디어이지만, 논리가 인스턴스를 만드는 것은 다소 간단합니다. –

+0

필자는 개인적으로'container.Resolve'를 호출 할 때 그 코드가 Composition Root 내부에 있고 (애플리케이션에서는 아님) 아무런 문제가 없지만 자동 (생성자) 인젝션을 사용하고자한다면'MyType'을 생성 할 수 있습니다 하위 클래스 (Composition Root 내부). 내 업데이 트를 참조하십시오. – Steven