2014-11-17 2 views
3

Привет, я хочу автоматизировать небольшую регистрацию моих зависимостей.Простой инжектор, регистрирующий динамические типы

Что я есть сейчас:

public interface IRepository<T> where T : class 

public interface IFolderRepository : IRepository<Folder> 

public class RepositoryBase<T> : IRepository<T>, IDisposable where T : class 

public class FolderRepository : RepositoryBase<Folder>, IFolderRepository 

Я зарегистрировал эту зависимость:

container.Register<IFolderRepository, FolderRepository>(); 

Все работает нормально, но в одном месте, мне нужно, чтобы сделать этот процесс родовым. Как:

var repository = container.GetInstance<IRepository<TModel>>(); 

и мне пришлось зарегистрироваться:

container.Register<IRepository<Folder>, RepositoryBase<Folder>>(); 

Есть ли способ, чтобы хорошо зарегистрировать IRepository вернуться для меня, например, если FolderRepository T: Папка.

Благодаря

+2

Почему IFolderRepository в первую очередь ? Если у вас уже есть IRepository , и вы пытаетесь получить экземпляр 'IRepository '? – decPL

+1

Что такое функция этого конкретного интерфейса IFolderRepository? Если вы намерены добавить определенные методы, [пожалуйста, не делайте этого] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92). – Steven

ответ

1

Вы можете зарегистрировать все общие случаи с использованием RegisterManyForOpenGeneric:

container.RegisterManyForOpenGeneric(typeof(IRepository<>), 
    typeof(IRepository<>).Assembly); 

и для открытых типов:

container.RegisterOpenGeneric(typeof(IRepository<>), typeof(RepositoryBase<>)); 

См документации here

+1

И приятная вещь о 'RegisterOpenGeneric' заключается в том, что он использует разрешение незарегистрированного типа, что в основном означает, что он работает как резервный механизм в случае, если явная регистрация не выполняется для закрытой версии интерфейса с использованием' RegisterManyForOpenGeneric'. – Steven

Смежные вопросы