Как должен выглядеть метод GetService в реализации IDependencyResolver для Unity? - PullRequest
0 голосов
/ 15 февраля 2012

Я хотел бы использовать Unity в качестве контейнера IoC для приложения ASP.NET MVC 3, но у меня возникли проблемы с моим классом UnityDependecyResolver. В настоящее время это выглядит так (скопировано откуда-то в Интернете, так как я не думаю, что сам Unity поставляется с этим):

public class UnityDependencyResolver : IDependencyResolver
{
    readonly IUnityContainer _container;
    public UnityDependencyResolver(IUnityContainer container)
    {
        this._container = container;
    }
    public object GetService(Type serviceType)
    {
        try
        {
            return _container.Resolve(serviceType);
        }
        catch
        {
            return null;
        }
    }
    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return _container.ResolveAll(serviceType);
        }
        catch
        {
            return new List<object>();
        }
    }
}

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

IControllerFactory 'System.Web.Mvc.DefaultControllerFactory' не вернул контроллер для имени 'Account'.

В этой статье StructureMap предлагается, чтобы я изменил метод GetService, однако я довольно новичок в MVC и Unity и не уверен, как именно он должен выглядеть.

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Взгляните на проект Unity.MVC на codeplex.

0 голосов
/ 20 февраля 2017

Это моя реализация и у меня это работает

   public class UnityResolver : IDependencyResolver 
    {

        private readonly IUnityContainer _container;

        public UnityResolver(IUnityContainer container)
        {
            _container = container;
        }

        public object GetService(Type serviceType)
        {
            if (typeof(IController).IsAssignableFrom(serviceType))
            {
                return _container.CreateChildContainer().Resolve(serviceType);
            }

            if (_container.IsRegistered(serviceType))
            {
                return _container.CreateChildContainer().Resolve(serviceType);
            }
            return null;
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return _container.CreateChildContainer().ResolveAll(serviceType);
        }

    } 
...