Стандартный подход заключается в создании экземпляра фабрики и в реализации вызова фабрики Resolve (). Я не хочу привязывать свой класс к контейнеру, потому что это кажется плохой практикой.
Стандартный подход:
T IDataRepositoryFactory.GetDataRepository<T>()
{
return MyProject.Bootstrapper.Container.Resolve<T>();
}
Вместо этого я пытаюсь использовать динамическое создание
public class SomethingManager
{
private readonly Func<Type, IRepository> repositoryFactory;
public SomethingManager(Func<Type, IRepository> aRepositoryFactory)
{
repositoryFactory = aRepositoryFactory;
}
public void GetSomething()
{
var repo1 = repositoryFactory(typeof(IBlogRepository));
var repo2 = repositoryFactory(typeof(IUserRepository));
(...)
}
}
Проблема в получении конкретной реализации. При стандартном подходе я мог бы сделать что-то вроде этого:
var something = repositoryFactory.GetDataRepository<IBlogRepository>();
С помощью динамической реализации от Autofac я могу передать интерфейс здесь:
var something = repositoryFactory(typeof(IBlogRepository));
но я понятия не имею, как правильно зарегистрировать это в autofac.
Какой обходной путь или решение этой проблемы?