【问题标题】:StructureMap Beginner | Property Injection结构图初学者 |属性注入
【发布时间】:2011-02-12 17:26:26
【问题描述】:

此问题的一部分已在此处提出:structuremap Property Injection 但从未给出答案。

使用 StructureMap,是否可以进行属性注入,这样

class SomeController : Controller
{
 public IService Service
 {
  get;
  set;
 }
}

被正确注入了吗?我是一个

【问题讨论】:

    标签: asp.net-mvc-3 structuremap


    【解决方案1】:

    StructureMap 支持setter/property injection。因此,您可以执行以下操作:

    public class SomeController : Controller
    {
        [SetterProperty]
        public IService Service { get; set; }
    }
    

    然后:

    ObjectFactory.Initialize(x =>
    {
        x.For<IService>()
         .Use<ServiceImpl>();
    });
    

    或者,如果您不喜欢使用 StructureMap 特定属性使控制器混乱的想法,您可以像这样配置它:

    ObjectFactory.Initialize(x =>
    {
        x.For<IService>()
         .Use<ServiceImpl>();
    
        x.ForConcreteType<SomeController>()
         .Configure
         .Setter<IService>(c => c.Service)
         .IsTheDefault();
    });
    

    另请注意,属性注入适用于该属性的存在对于控制器的正确运行不是强制性的情况。例如考虑一个记录器。如果控制器的使用者没有将记录器的任何特定实现注入到属性中,控制器仍然可以工作,只是它没有记录。在您的情况下,您正在使用服务,如果您的控制器操作依赖于该服务,我将使用构造函数注入。所以你应该问自己的问题是:如果这个属性是null,当我调用它的一些动作时,我的控制器会崩溃吗?如果这个问题的答案是肯定的,那么我会推荐构造函数注入。此外,当您使用构造函数注入时,您会强制此控制器的使用者指定一个实现,因为如果没有在构造函数中传递适当的服务,他就无法获得控制器的实例。

    【讨论】:

    • 谢谢达林。对于我的项目,我仍在尝试在StructureMapCastle.Windsor 之间做出决定,而属性注入对我来说非常重要。你知道StructureMap 是否可以注入 MVC 动作过滤器或模型绑定器?
    • 另外,要应用 setter 属性的属性必须是公共的。 (至少这是我发现的)这很有意义,但如果你像我一样将它添加到现有的类和道具中,很容易被忽视。否则您的属性将为空。
    【解决方案2】:

    要为特定类型的所有属性注入依赖项,请使用 SetAllProperties 方法作为 ObjectFactory 初始化的一部分:

    ObjectFactory.Initialize(x =>
    {
       x.SetAllProperties(x => x.OfType<IService>());
    });
    

    也可以为 setter 注入定义策略,参见this post

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      相关资源
      最近更新 更多