【问题标题】:Ninject and binding genericsNinject 和绑定泛型
【发布时间】:2012-07-27 06:22:36
【问题描述】:

警告:我刚刚开始探索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&lt;T&gt; 的依赖。

在我的 Ninject 模块中,我是这样进行绑定的。 从配置存储中检索元数据,并允许我指定要绑定的具体类型。

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 表达这种依赖关系?

感谢您的帮助。

【问题讨论】:

标签: c# generics ninject


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多