Как правильно внедрить Unity в ASP.Net MVC? - PullRequest
0 голосов
/ 22 февраля 2011

Хорошо, в Google так много результатов при поиске по этой теме; NerdDinner , CodeClimber , CodeProject и т. Д., Но все они, похоже, не работают должным образом!Либо они дают ошибку во время сборки или во время выполнения!Как правильно внедрить Unity 2.0 в ASP.Net MVC 2?Я просто не могу заставить это работать!

Ваша помощь и мысли высоко ценятся.Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 февраля 2011

Попробуйте написать простую фабрику контроллеров с использованием Unity, которая способна разрешить экземпляры контроллера:

public class UnityControllerFactory : DefaultControllerFactory 
{
    private readonly IUnityContainer _container; 
    public UnityControllerFactory(IUnityContainer container) 
    { 
        _container = container; 
    }

    protected override IController GetControllerInstance(
        RequestContext requestContext, 
        Type controllerType
    ) 
    { 
        if (controllerType == null)
        {
            throw new ArgumentNullException("controllerType");
        }
        if (!typeof(IController).IsAssignableFrom(controllerType))
        {
            throw new ArgumentException("Type requested is not a controller", "controllerType");
        }
        return _container.Resolve(controllerType) as IController; 
    }
}

, а затем подключить его в событии Application_Start в Global.asax:

protected void Application_Start()
{
    ...
    var container = new UnityContainer();
    // TODO: Configure the container here with your controllers

    var factory = new UnityControllerFactory(container);
    ControllerBuilder.Current.SetControllerFactory(factory);
}
1 голос
/ 22 февраля 2011

Это моя версия UnityControllerFactory. Он использует отражение, чтобы получить контроллеры из вызывающей сборки и зарегистрировать их в контейнере.

using System;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.Web.Mvc;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;

namespace WebProveidorsMVC.DI.ControllerFactories
{
    public class UnityControllerFactory : DefaultControllerFactory
    {
        private readonly IUnityContainer _container;

        public UnityControllerFactory()
        {
            _container=new UnityContainer();

            ((UnityConfigurationSection) ConfigurationManager.GetSection("unity")).Configure(_container);

            var controllerTypes = from t in Assembly.GetCallingAssembly().GetTypes()
                                  where typeof(IController).IsAssignableFrom(t)
                                  select t;

            foreach (var t in controllerTypes)
                _container.RegisterType(t, t.FullName);
        }

        protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
        {
            if (controllerType != null)
                return (IController)_container.Resolve(controllerType);
            return null;
        }

        public override void ReleaseController(IController controller)
        {
            _container.Teardown(controller);
            base.ReleaseController(controller);
        }
    }
}

Тогда в моем ApplicationStart методе я регистрирую это так:

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