2

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 をすべて削除し、代わりに新しい Dependency Resolver を実装しました。したがって、上記を次のように変更しました。

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

ただし、これは null を返します。

これが役立つ場合の依存関係リゾルバーの実装です。

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 に答える