警告:我刚刚开始探索 Ninject 。
我有一个通用的DomainObject类,定义如下:
public abstract class DomainObject<T> : IDomainObject where T : IDomainObject
{
protected DomainObject(IDataProvider<T> dataProvider)
{
DataProvider = dataProvider;
}
// blah and blih
protected IDataProvider<T> DataProvider { get; private set; }
}
正如您在上面的代码中看到的那样,DomainObject
有一个构造函数表示对IDataProvider<T>
的依赖。
在我的Ninject模块中,这是我如何进行绑定。 从配置存储中检索metaData,并允许我指定要绑定的具体类型。
var medaData = DataContextDictionary.Items[type];
var genericDomainObjectType = typeof (DomainObject<>);
Type[] genericDomainObjectTypeArgs = { medaData.ObjectType };
var domainObjectType = genericDomainObjectType.MakeGenericType(genericDomainObjectTypeArgs);
Bind(domainObjectType).To(medaData.ObjectType);
var genericIDataProviderType = typeof (IDataProvider<>);
var iDataProviderType = genericIDataProviderType.MakeGenericType(genericDomainObjectTypeArgs);
Bind(iDataProviderType).To(medaData.DataProviderType);
这很好但我觉得这个代码是人为的,可以用更好的方式编写。
有没有更好的方法来表达Ninject的依赖?
感谢您的帮助。
答案 0 :(得分:2)
您是要根据代码中的'medaData'类型绑定开放的通用版本还是仅绑定特定的封闭类型?
如果绑定开放类型是意图(或可接受),那么至少在Ninject 3中,您应该能够“正常”绑定它们,如下所示:
Bind(typeof(IDataProvider<>)).To(typeof(DataProvider<>));
如果你想坚持绑定特定的封闭类型,我不知道一个比你已经更好的机制(除非你可以使用约定扩展)。