C# 将对象注入到";“请求”;将范围转换为原型对象

C# 将对象注入到";“请求”;将范围转换为原型对象,c#,.net,asp.net-mvc,asp.net-mvc-2,spring.net,C#,.net,Asp.net Mvc,Asp.net Mvc 2,Spring.net,我在Asp.NETMVC应用程序中使用Spring.Net,其中控制器必须定义为原型(非单例)。我有一些对象必须有一个请求范围(每个请求都有一个新对象)。有没有办法把它们注入我的控制器 <object type="xx.CompanyController, xx" singleton="false"> <property name="Service" ref="ServiceA" /> </object> <object id="S

我在Asp.NETMVC应用程序中使用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”也不起作用(控制器被视为singleton)


我将Spring.Net 1.3.1与MVCAPApplicationContext一起使用,您应该自己设置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是一个类,它有一个用于注入的解析方法,我使用的是Unity,我不能给IoCWorker实现——如果您需要,我可以共享

它将为您的控制器工作


祝你好运。

问题不在于asp.net MVC中的IoC是否可行(我已经在Spring.net中使用了它),而在于(Spring-)对象定义的不同(Spring-)范围。我注意到了同样的行为。也就是说,如果使用请求范围定义的对象是单例对象的依赖项,那么它们将“升级”到单例范围。