ASP.NET MVC 3 - проблема решения зависимостей при замене локатора общих служб - PullRequest
2 голосов
/ 31 августа 2011

Используя Microsoft Unity, я регистрирую следующий тип:

container.RegisterType(typeof(IRepository<>), typeof(NHibernateRepository<>));

В ASP.NET MVC 2 я мог тогда сделать следующее:

var repository = ServiceLocator.Current
    .GetInstance(typeof(IRepository<>).MakeGenericType(bindingContext.ModelType));

Но в версии 3. У меня естьудалил все вхождения Service Locator и вместо этого внедрил новый Resoldency Resolver.Поэтому я изменил вышеупомянутое значение на:

var repository = DependencyResolver.Current
    .GetService(typeof(IRepository<>).MakeGenericType(bindingContext.ModelType));

Однако теперь это возвращает ноль.

Вот моя реализация средства разрешения зависимостей, если это помогает:

public class UnityDependencyResolver : IDependencyResolver {
    private readonly IUnityContainer _container;

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

    public object GetService(Type serviceType) {
        return typeof(IController).IsAssignableFrom(serviceType) ||
            _container.IsRegistered(serviceType) ?
            _container.Resolve(serviceType) : null;
    }

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

IБуду очень признателен, если кто-нибудь покажет мне, что я сделал неправильно.Спасибо

1 Ответ

1 голос
/ 31 августа 2011

У меня кончилось терпение, и я решил пойти на пробный подход, которого я изначально пытался избежать.Вот мой новый метод определения зависимостей:

public class UnityDependencyResolver : IDependencyResolver {
    private readonly IUnityContainer _container;

    public UnityDependencyResolver(IUnityContainer container) {
        _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>();
        }
    }
}

Надеюсь, это поможет.

...