Внедрить объект с областью запроса в объект-прототип - PullRequest
3 голосов
/ 20 января 2011

Я использую Spring.Net в своем приложении Asp.Net MVC, где контроллеры должны быть определены как прототипы (не одноэлементные).У меня есть объекты, которые должны иметь область запроса (новый объект для каждого запроса).Есть ли способ ввести их в мой контроллер?

  <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 с MvcApplicationContext

1 Ответ

0 голосов
/ 10 февраля 2011

Вы должны установить 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 inject для вашего контроллера.

Удачи.

...