В asp.net MVC2 с использованием Unity должна ли моя программа управлять временем жизни контейнера? - PullRequest
1 голос
/ 15 января 2010

Я помещаю создание / настройку контейнера Unity в global.asax. и сделать контейнер статическим свойством для этого класса, так как я не уверен, как работает Unity или нужно ли поддерживать контейнер в рабочем состоянии и ссылаться где-либо еще. Каково рекомендуемое расположение инициализации / конфигурации для mvc 2?

Ответы [ 2 ]

1 голос
/ 15 января 2010

Вам не нужно хранить явную ссылку на контейнер.Контейнер должен соединить запрошенный граф объектов (в данном случае это контроллеры) и уйти.

Взгляните на специфичные для контейнера реализации IControllerFactory в MVCContrib .

Тем не менее, мне нравится WindsorControllerFactory намного лучше, чем UnityControllerFactory, но вы могли бы реализовать UnityControllerFactory, который использует тот же шаблон ( Constructor Injection ) как WindsorControllerFactory.вы представляете, что мы делаем это, ваш Global.asax должен выглядеть следующим образом:

var container = new UnityContainer();

// configure container

var controllerFactory = new UnityControllerFactory(container);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);

controllerFactory содержит ссылку на контейнер, поэтому вы можете выпустить его из области видимости в Application_Start - он собираетсяоставайтесь рядом, потому что ControllerFactory остается рядом.

0 голосов
/ 15 января 2010

Вот как мы это сделали:

public class UnityControllerFactory : DefaultControllerFactory
{
    private IUnityContainer container;

    public UnityControllerFactory(IUnityContainer container)
    {
        this.container = container;
    }

    public static void Configure()
    {
        IUnityContainer container = new UnityContainer();
        //...Register your types here

        ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            return base.GetControllerInstance(requestContext, controllerType);
        }

        if (!typeof(IController).IsAssignableFrom(controllerType))
        {
            throw new ArgumentException("Type requested is not a controller", "controllerType");
        }

        return container.Resolve(controllerType) as IController;
    }
}

А потом в global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        .... whatever you like
    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
        UnityControllerFactory.Configure();
    }
}
...