【问题标题】:StructureMap, configure using container or objectfactory?StructureMap,使用容器或对象工厂配置?
【发布时间】:2016-08-22 20:58:03
【问题描述】:

我的配置是这样的:

var container = new Container(x =>
                                              {
                                                  x.For<IEngine>().Use<V6Engine>();
                                                  x.For<ICar>().Use<HondaCar>();
                                              }
);

然后在我的 mvc 控制器操作中我做了:

ICar car = ObjectFactory.GetInstance<ICar>();

我应该以某种方式使用 Container 或 ObjectFactory 设置我的容器吗?它没有解决,所以我在一个 c# 控制台应用程序中进行了测试,如果我这样做了,它就可以工作:

ICar car = container.GetInstance<ICar>();

但这仅适用于容器在本地范围内的情况,而在 Web 应用程序中,这并不明显,因为事情是在 global.asax.cs 中连接起来的

【问题讨论】:

    标签: c# structuremap


    【解决方案1】:

    ObjectFactory 是容器实例的静态网关。如果您只想要一个容器实例,并且想要一种简单的静态方式来获取它,请使用 ObjectFactory。您必须初始化 ObjectFactory,然后通过 ObjectFactory 检索您的实例。

    或者,如果你想自己管理容器的生命周期,你可以创建一个容器的实例,将初始化表达式传递给构造函数。然后,您从您声明的用于存储容器的变量中检索实例。

    在您的示例中,您将两种方法混合使用,这是行不通的。

    【讨论】:

      【解决方案2】:

      我的配置如下

      global.asax

        ObjectFactory.Initialize(action =>
                  {
                      action.For<ISomething>().Use<Something>;
                  });
      

      然后是其他地方。

       ObjectFactory.GetInstance<ISomething>();
      

      这可能不是唯一的方法。另外我认为您可能正在寻找的是

      Scan(scanner =>
              {
                  scanner.AssemblyContainingType(....);
                  scanner.AddAllTypesOf(....);
              }
      

      【讨论】:

      • 嗨,我自己对结构映射很陌生-我认为如果您要在无参数构造函数中使用 ObjectFactory.GetInstance 而不是通过参数传递它并让 IoC 容器,这只是一种反模式做这项工作?您能否详细说明一下,因为我不想养成坏习惯。是简单的调用,例如 IService service = ObjectFactory.GetInstance();好吧,如果不是紧密耦合两个元素?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      相关资源
      最近更新 更多