Ninject和绑定泛型

时间:2012-07-27 06:22:36

标签: c# generics ninject

警告:我刚刚开始探索 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的依赖?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您是要根据代码中的'medaData'类型绑定开放的通用版本还是仅绑定特定的封闭类型?

如果绑定开放类型是意图(或可接受),那么至少在Ninject 3中,您应该能够“正常”绑定它们,如下所示:

Bind(typeof(IDataProvider<>)).To(typeof(DataProvider<>));

如果你想坚持绑定特定的封闭类型,我不知道一个比你已经更好的机制(除非你可以使用约定扩展)。