【问题标题】:Structuremap Configuration with generics使用泛型的结构图配置
【发布时间】:2012-04-15 23:21:03
【问题描述】:

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

如何配置结构图?

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

我在 T 上遇到错误。

【问题讨论】:

  • 试试这个:x.For(typeof(IRepository&lt;&gt;)).Use(typeof(NHibernateRepository&lt;&gt;));

标签: c# dependency-injection structuremap


【解决方案1】:

如果您希望能够将IRepository&lt;&gt; 的所有关闭类型映射到NHibernateRepository&lt;&gt; 的相应关闭类型,请使用:

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

【讨论】:

    【解决方案2】:

    也许用动态替换&lt;T&gt;

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

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

    【讨论】:

      【解决方案3】:

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

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

      关于 ApplicationContext 静态类:如果你真的有一个横切关注点,那么我认为它没有什么问题。

      【讨论】:

        【解决方案4】:

        此行期望替换通用参数T

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

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

        或者,看看使用非泛型 IRepository,见这里:Generic repository - IRepository<T> or IRepository

        【讨论】:

        • 接口和实现都是通用的,所以我可以使用任何模型类。
        • 绝对可以,但不能在代码中使用泛型类型,因为它在类中未声明。也许使用没有泛型的 IRepository,或者按照其他答案的建议尝试动态。
        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多