Unity: как разрешить класс через базовый интерфейс - PullRequest
2 голосов
/ 30 ноября 2010

Вот мой класс хранилища:

public interface IMyRepository : IRepository<IMyEntity>{}

public class MyRepository : IMyRepository
{
...
}

Вот способ зарегистрировать его:

container.Register<IMyRepository, MyRepository >();

Вот как я хочу разрешить хранилище:

IRepository<IMyEntity> repository = container.Resolve<IRepository<IMyEntity>>();

Попытка разрешить хранилище таким способом выдает ошибку:

Не удалось разрешить зависимость, type = "CMCore.Repository.IRepository`1 [CMCore.Data.ICmCoreLog]", name = "(none)". Исключение произошло во время: при разрешении.

Исключением является: InvalidOperationException - Текущий тип, IRepository`1 [IMyEntity], является интерфейсом и не может быть создан. Вам не хватает отображения типов?

На момент исключения контейнер был:

Разрешение IRepository`1 [IMyEntity], (нет)

Что не так в моем подходе? Как правильно достичь указанной функциональности?

Большое спасибо!

P.S. Иногда я хочу разрешить свой класс через IMyRepository, иногда через IRepository. Стоит ли дважды регистрировать класс?

Ответы [ 2 ]

3 голосов
/ 30 ноября 2010

Do:

container.RegisterType<IRepository<IMyEntity>, MyRepository>();

вместо.По замыслу Unity работает только один уровень отображения типов.Он только будет искать отображение по типу, который вы запрашиваете, он не гонится за деревьями наследования.

Если вы хотите, чтобы он был доступен как для IRepository, так и для IMyRepository, просто зарегистрируйте его дважды:

container.RegisterType<IRepository<IMyEntity>, MyRepository>()
    .RegisterType<IMyRepository, MyRepository>();
1 голос
/ 30 ноября 2010
IMyRepository repository = container.Resolve<IMyRepository>();
...