StructureMap初学者|物业注入

时间:2011-02-12 17:26:26

标签: asp.net-mvc-3 structuremap

这个问题的一部分已经在这里被问到:structuremap Property Injection但答案从未给出。

使用StructureMap,可以进行Property Injection以便

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

正确注射?我是

2 个答案:

答案 0 :(得分:19)

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,当我调用其操作时,我的控制器是否会崩溃?如果这个问题的答案是肯定的,那么我会建议构造函数注入。此外,当您使用构造函数注入时,强制此控制器的使用者指定实现,因为他无法在构造函数中传递适当的服务而无法获取控制器的实例。

答案 1 :(得分:4)

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

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

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