2

使用 Microsoft Unity 我注册了以下类型:

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

在 ASP.NET MVC 2 中,我可以执行以下操作:

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

但是在第 3 版中。我已经删除了所有出现的服务定位器,而是实现了新的依赖解析器。因此,我将上述内容更改为:

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

但是,这现在返回 null。

如果有帮助,这是我对 Dependency Resolver 的实现:

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);
    }
}

如果有人能告诉我我做错了什么,我将不胜感激。谢谢

4

1 回答 1

1

我已经没有耐心了,决定采用我最初试图避免的 Try/Catch 方法。这是我的新依赖解析器:

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>();
        }
    }
}

希望这可以帮助。

于 2011-08-31T15:52:24.513 回答