我在Asp.Net MVC应用程序中使用Spring.Net,其中控制器必须定义为原型(非单例)。我有必须具有请求范围的对象(每个请求的新对象)。有没有办法将它们注入我的控制器?
<object type="xx.CompanyController, xx" singleton="false">
<property name="Service" ref="ServiceA" />
</object>
<object id="ServiceA" type="xx.ServiceA, xx" scope="request"/>
<property name="ObjectB" ref="ObjectB" />
</object>
<object id="ObjectB" type="xx.ObjectB, xx" scope="request"/>
像这样,除控制器之外的所有对象都被视为单例。 ObjectB不能是原型,因为它需要共享同一个实例的其他一些对象引用它。从控制器中删除singleton =“false”并添加scope =“request”也不起作用(控制器被视为单例)。
我将Spring.Net 1.3.1与MvcApplicationContext一起使用
答案 0 :(得分:0)
您应该使用自己的ControllerFactory进行设置。
protected void Application_Start()
{
//...
ControllerBuilder.Current.SetControllerFactory(new IoCControllerFactory());
//...
}
IoCControllerFactory必须从DefaultControllerFactory继承
public class IoCControllerFactory : DefaultControllerFactory
并覆盖GetControllerInstance
protected override IController GetControllerInstance (RequestContext requestContext, Type controllerType)
{
ObjectTypeUtility.ArgumentIsNull(controllerType, "controllerType", true);
if (!typeof(IController).IsAssignableFrom(controllerType))
throw new ArgumentException(string.Format(
"Type requested is not a controller: {0}",
controllerType.Name),
"controllerType");
IController controller = IoCWorker.Resolve(controllerType)
as IController;
return controller;
}
IoCWorker是一个具有Resolve解释方法的类,我正在使用Unity而我无法提供IoCWorker实现 - 如果您需要我可以共享 - 。
它将为你的控制器注入ctor。
祝你好运。