这个问题的一部分已经在这里被问到:
structuremap Property Injection但答案从未给出过.
使用StructureMap,可以进行Property Injection
class SomeController : Controller { public IService Service { get; set; } }
注射得当吗?我是一个
解决方法
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,当我调用它的一些动作时,我的控制器会崩溃吗?如果这个问题的答案是肯定的,那么我会建议构造函数注入.此外,当您使用构造函数注入时,强制此控制器的使用者指定实现,因为他无法在构造函数中传递适当的服务而无法获取控制器的实例.