6

我想使用StructureMap为我的MVC项目设置setter/property注入,但我似乎无法得到它来设置属性。我很清楚Constructor注入是推荐的做法,但我有一个严格的要求,要求我们使用setter注入来进行注入,所以请保留试图告诉我的注释。StructureMap设置注入没有设置属性

我有正常的样板设置代码,如我的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 
{ 

} 

最后,我有我的控制器, l具备,需要有注入到它的具体支付服务实现属性:

公共类HomeController的:控制 { 公共IPaymentService服务{获取;集;}

public ActionResult Index(){ 
     var test = Service... //Service is Null 
} 

}

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

此外,我已经尝试使用[SetterProperty]只是为了看它是否工作(我没有打算与这些属性耦合我的控制器),它仍然没有工作。

我不确定是否需要做别的事情,或者可能出现什么问题。我一直在使用StructureMap构造函数注入。

+0

你有Setter注入任何运气?我试图在动作过滤器,但它似乎也没有工作。 – ntombela

+0

经过努力注入二传手后,我决定离开它。 – Joel

回答

3

尝试下探这一行:

x.ForConcreteType<HomeController>().Configure 
    .Setter<IPaymentService>(y => y.PaymentService).IsTheDefault(); 

它不应该是必要的。

鉴于以下控制器:

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()); 
+0

如果该属性位于'controller'类中,则此解决方案正常工作,在我的情况下,该属性是“非控制器”类,因此您的答案对我无能为力。 –

+0

它不应该做任何差异*提供*您已经配置StructureMap与对象图中的所有依赖关系。 –

+0

我把我的属性'IUnitOfWork'放在我的控制器中,它获取值,但是当我把它放在另一个类MyServiceFactory中并在我的控制器中实例化MyServiceFactory类时,IUnitOfWork属性为null。 –