我正在尝试使用 StructureMap 为我的 MVC 项目设置 setter /属性注入(inject),但我似乎无法使用它来设置属性。我很清楚构造函数注入(inject)是推荐的做法,但我有一个严格的要求,要求我们使用 setter 注入(inject)来做到这一点,所以请保留评论试图告诉我否则。
我的 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>();
});
});
我的 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 ;
}
}
我有以下服务/实现类对
public interface IPaymentService
{
}
public class PaymentService:IPaymentService
{
}
最后,我的 Controller 将具有需要将具体支付服务实现注入(inject)其中的属性:
公共(public)类 HomeController:Controller { 公共(public) IPaymentService 服务 {get;set;}
public ActionResult Index(){
var test = Service... //Service is Null
}
如上所示,当我调试时该属性仍然为空。
此外,我尝试使用 [SetterProperty] 只是为了看看它是否有效(我无意将我的 Controller 与这些属性耦合),但它仍然无效。
我不确定我是否需要做其他事情,或者可能是什么问题。我使用 StructureMap 的构造函数注入(inject)已经有一段时间了。
最佳答案
尝试删除这一行:
x.ForConcreteType<HomeController>().Configure
.Setter<IPaymentService>(y => y.PaymentService).IsTheDefault();
应该没有必要。
给定以下 Controller :
public class HomeController : Controller
{
public IMsgService Service { get; set; }
public ActionResult Index()
{
return Content(Service.GetMessage());
}
}
这就是配置 StructureMap 以设置属性所需的全部内容:
ObjectFactory.Initialize(cfg =>
{
cfg.For<IMsgService>().Use<MyMsgService>();
cfg.SetAllProperties(prop =>
{
prop.OfType<IMsgService>();
});
});
ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
关于c# - StructureMap Setter 注入(inject)未设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12523337/