c# - StructureMap Setter 注入(inject)未设置属性

标签 c# asp.net-mvc-3 dependency-injection inversion-of-control structuremap

我正在尝试使用 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/

相关文章:

python - 如何做依赖注入(inject)python-way?

c# - 在 Entity Framework 4.1 中查询数据页面并获取总数的更好方法?

html - 如何使用 MVC 3 在 IE6 中将文本放在图像旁边

jsf - 抽象类和具体类中的依赖注入(inject)

c# - ASP.NET MVC 3,代码优先 EF : OriginalValues?

nhibernate - Autofac - 没有找到带有 'Public binding flags' 的构造函数

c# - 构造函数注入(inject)和默认重载

c# - DDD(领域驱动设计)应用层

C# ASP.NET Core 2.0 + Azure AD 身份验证 : auto sign out after user's inactivity for certain period

c# - Entity Framework 4.0 - 返回模型对象列表 + 每个对象的子对象数