使用泛型的结构图配置

时间:2012-04-15 23:21:04

标签: c# dependency-injection structuremap

我有IRepository接口,我想使用NHibernateRepository。

如何使用结构图配置它?

protected void ConfigureDependencies()
{
    ObjectFactory.Initialize(
        x =>
            {
                x.For<ILogger>().Use<Logger>();
                x.For<IRepository<T>>().Use<NHibernateRepository<T>>();
            }
        );
}

我在T上收到错误。

4 个答案:

答案 0 :(得分:2)

如果您希望能够将IRepository<>的所有结束类型映射到NHibernateRepository<>的相应结束类型,请使用:

x.For(typeof(IRepository<>)).Use(typeof(NHibernateRepository<>))

答案 1 :(得分:0)

此行期望替换泛型参数T

x.For<IRepository<T>>().Use<NHibernateRepository<T>>();

即,哪种类型T将存储在存储库中?您已选择NHibernateRepository类作为IRepository的实现,但尚未显示将存储哪个内部类。

或者,查看使用非通用IRepository,请参阅此处:Generic repository - IRepository<T> or IRepository

答案 2 :(得分:0)

或许用动态替换<T>

x.For<IRepository<dynamic>>().Use<NHibernateRepository<dynamic>>();

至于第二点,单身/服务定位模式是一个相当激烈的争论。

答案 3 :(得分:0)

看看this article。基本上,你想要做的是这样的事情:

public void ConfigureDependencies()
{
    ObjectFactory.Initialize(x => x.Scan(cfg =>
    {
        cfg.TheCallingAssembly();
        cfg.IncludeNamespaceContainingType<Logger>();
        cfg.ConnectImplementationsToTypesClosing(typeof(NHibernateRepository<>));
    }));
}

关于ApplicationContext静态类:如果你真的有一个跨领域的问题,那么我认为它没有什么问题。