2011-08-23 67 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',但如果要使用自動(構造函數)注入,則可以創建一個「MyType」子類(在Composition Root內),它取得兩個依賴關係;看到我的更新。 – Steven