Я использую Autofac в качестве контейнера IoC.У меня есть:
IRepository<>
, мой интерфейс хранилища; DbContextRepository<>
, общая реализация хранилища с использованием EntityFramework's DbContext; - Некоторые репозитории закрытых типов внутри сборки, скажем
PersonRepository : DbContextRepository<Person>
; - и
RepositoryDecorator<>
, который украшает мои репозитории некоторым стандартным дополнительным поведением;
Я использую autofac для их регистрации следующим образом:
builder.RegisterGeneric(typeof(DbContextRepository<>))
.Named("repo", typeof(IRepository<>));
builder.RegisterGenericDecorator(
typeof(RepositoryDecorator<>),
typeof(IRepository<>),
fromKey: "repo");
var repositorios = Assembly.GetAssembly(typeof(PersonRepository));
builder.RegisterAssemblyTypes(repositorios).Where(t => t.Name.EndsWith("Repository"))
.AsClosedTypesOf(typeof(IRepository<>))
.Named("repo2", typeof(IRepository<>))
.PropertiesAutowired();
builder.RegisterGenericDecorator(
typeof(RepositoryDecorator<>),
typeof(IRepository<>),
fromKey: "repo2");
Я пытаюсь сделать следующее:
- , чтобы зарегистрировать
DbContextRepository<>
как универсальную реализацию IRepository<>
; - затем зарегистрируйте репозитории закрытых типов, чтобы при необходимости они могли перегрузить предыдущую регистрацию;
- Затем украсьте их оба, поэтому, когда я прошу контейнер разрешить IRepository, он дает мне RepositoryDecorator с правильной реализацией IRepository, будь то DbContextRepository или уже зарегистрированный закрытый тип.
Когда я пытаюсь разрешить IRepository<Product>
, который не имеет реализации закрытого типа, он корректно возвращает Decorated DbContextRepository.
Но когда я пытаюсь разрешить IRepository<Person>
, который имеет реализация закрытого типа, она также дает мне Decorated DbContextRepository вместо Decorated PersonRepository.