将具有“请求”范围的对象注入到原型对象中

时间:2011-01-20 19:44:58

标签: c# .net asp.net-mvc asp.net-mvc-2 spring.net

我在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一起使用

1 个答案:

答案 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。

祝你好运。