Unity.Mvc3 Разрешить тип интерфейса <T> - PullRequest
3 голосов
/ 10 сентября 2011

Я использую Unity.Mvc3 в своем проекте, и в него встроено UnityDependencyResolver .

var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));

, а метод BuildUnityContainer выглядит следующим образом:

private static IUnityContainer BuildUnityContainer()
{
    var container = new UnityContainer()
        .RegisterType<IControllerActivator, HControllerActivator>()
        .RegisterType<IDatabaseFactory, DatabaseFactory>(
            new HierarchicalLifetimeManager())
        .RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager())
        .RegisterType<IRepository<Article>, HRepository<Article>>()
        .RegisterType<IRepository<ContentBase>, HRepository<ContentBase>>()
        .RegisterType<IRepository<User>, HRepository<User>>()
        .RegisterType<IRepository<Profile>, HRepository<Profile>>();

    container.RegisterControllers();

    return container;
}

но когда я пытаюсь разрешить мой тип следующим образом:

var users = DependencyResolver.Current.GetService<IRepository<User>>();

я получаю следующее исключение:

Не удалось разрешить зависимость, type = "Data.IRepository 1[Data.Models.User]", name = "(none)". Exception occurred while: while resolving. Exception is: InvalidOperationException - The type HRepositoryНевозможно создать 1. Вы должны сконфигурировать контейнер для предоставления этого значения.

Что я делаю не так? И возможно ли на самом деле использовать .RegisterType<IFoo<T>, Foo<T>>()? Может быть, мне нужен какой-то пользовательский DependencyResolver?

Заранее спасибо:)

1 Ответ

2 голосов
/ 10 сентября 2011

То, что вы пытаетесь сделать, должно быть возможным.Unity может не знать, как построить HRepository<T>.

Как выглядит класс HRepository<T>?В частности, каковы параметры конструктора и нужно ли регистрировать какие-либо из их типов в Unity?

Unity не сможет разрешить HRepository<T>, если не знает, как построить свои параметры.

...