2010-09-18 88 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