StructureMap Setter注入不设置属性

The*_*boy 6 c# structuremap dependency-injection inversion-of-control asp.net-mvc-3

我正在尝试使用StructureMap为我的MVC项目设置setter/property注入,但我似乎无法设置属性.我很清楚构造函数注入是推荐的做法,但我有一个严格的要求,要求我们使用setter注入,所以请保持评论试图告诉我否则.

我有正常的样板设置代码,例如我的Global.asax中的以下内容

ControllerBuilder.Current.SetControllerFactory(new TestControllerFactory());

ObjectFactory.Initialize(x => {
            x.For<IPaymentService>().Use<PaymentService>();
            x.ForConcreteType<HomeController>().Configure.Setter<IPaymentService>(y => y.PaymentService).IsTheDefault();
            x.SetAllProperties(y =>
            {
                y.OfType<IPaymentService>();
            });

        });
Run Code Online (Sandbox Code Playgroud)

我的TestControllerFactory如下所示:

public class TestControllerFactory:System.Web.Mvc.DefaultControllerFactory
{
    protected  IController GetControllerInstance(Type controllerType)
    {
        if (controllerType == null)
            throw new ArgumentNullException("controllerType");
        return ObjectFactory.GetInstance(controllerType) as IController ;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有以下服务/实现类对

public interface IPaymentService
{

}

public class PaymentService:IPaymentService
{

}
Run Code Online (Sandbox Code Playgroud)

最后,我的控制器将具有需要将具体支付服务实现注入其中的属性:

public class HomeController:Controller {public IPaymentService Service {get; set;}

 public ActionResult Index(){
        var test = Service... //Service is Null
 }
Run Code Online (Sandbox Code Playgroud)

}

如上所示,当我调试时,该属性保持为null.

另外,我尝试使用[SetterProperty]只是为了看它是否有效(我无意将控制器与这些属性耦合),它仍然没有用.

我不确定我是否需要做其他事情,或者问题可能是什么.我一直在使用StructMap的构造函数注入很长一段时间.

Ben*_*ter 3

尝试删除这一行:

x.ForConcreteType<HomeController>().Configure
  .Setter<IPaymentService>(y => y.PaymentService).IsTheDefault();
Run Code Online (Sandbox Code Playgroud)

应该没有必要。

给定以下控制器:

public class HomeController : Controller
{
    public IMsgService Service { get; set; }

    public ActionResult Index()
    {
        return Content(Service.GetMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是配置 StructureMap 以设置属性所需的全部内容:

ObjectFactory.Initialize(cfg =>
{
    cfg.For<IMsgService>().Use<MyMsgService>();

    cfg.SetAllProperties(prop =>
    {
        prop.OfType<IMsgService>();
    });
});

ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
Run Code Online (Sandbox Code Playgroud)