2010-09-18 36 views
5

我對Ninject相當陌生,但我已成功設法將它用於使用自定義提供程序的DI。Ninject,Providers and Activator.CreateInstance

的結合被初始化如下

kernel = new StandardKernel(); 

kernel.Bind<IPatientRecordLocator>().ToProvider<PatientRecordLocatorProvider>(); 

,並在自定義提供我打電話Activator.CreateInstance像這樣

protected override IPatientRecordLocator CreateInstance(IContext context) 
{ 
    var name = ConfigurationManager.AppSettings["PatientRecordLocator"]; 
    var typeName = name.Split(',')[0]; 
    var assemblyName = name.Split(',')[1]; 
    return Activator.CreateInstance(assemblyName, typeName).Unwrap() as IPatientRecordLocator; 
} 

(是的,我知道,有沒有錯誤處理,等在上面的代碼:))

和所有這些工作就像一個魅力。

現在,我面臨的問題是當我引入一個新的類,我想注入IPatientRecordLocator的實例。當我將如下構造函數添加到例如

[Inject] 
public MockPatientRecordLocator (IContactAdapter contactAdapter) 
{ 
    ... 
} 

然後將這些類之一,對Activator.CreateInstance工作,我也有一個參數的構造函數添加到類MockPatientRecordLocator,即

public MockPatientRecordLocator() 
{ 
} 

所以,我的問題是:如何才能讓Ninject將一個實現IContactAdapter的類的實例注入到例如MockPatientRecordLocator?我試過方法注入,但無濟於事。

我忘了解釋,我想要實現的是一種鏈式注入,類PatientRecordSummary的一個實例被注入了一個MockPatientRecordLocator的實例(使用構造函數注入),並且所述的MockPatientRecordLocator實例應該注入一個IContactAdapter實例(再次使用構造函數注入(如果可能的話))。鏈條的第一部分起作用,第二部分不起作用。

回答

1

對第一個問題不壞!

您想使用Bind(Type)超載允許的,你不要在你的Load()代碼內靜態可用的東西登記 - 做的東西,你在你的供應商做的(即解決Type)的前期。這將允許Ninject做對象實例化(不需要任何默認的.ctor)

IIRC two or 3 of my most recent answers也觸及這個發現/加載的東西,並且有與您的案例相關的示例。

(你不會需要求助於[Inject]屬性時,你已經得到清除的東西)

+0

魯您好,感謝您的幫助(和恭維)。嘗試最好的我可以:-)在這個特定的設置中,我沒有使用模塊,但我會切換到使用它們,這樣我可以更容易地使用Bind()。 – norgie 2010-10-18 22:59:34