【发布时间】:2018-04-26 13:10:36
【问题描述】:
标准方法是实例化工厂并在工厂调用 Resolve() 的实现中。我不想将我的课程绑定到容器,因为这似乎是一种不好的做法。
标准方法:
T IDataRepositoryFactory.GetDataRepository<T>()
{
return MyProject.Bootstrapper.Container.Resolve<T>();
}
相反,我正在尝试使用dynamic instantiation
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 中正确注册它。 有什么解决方法或解决方案?
【问题讨论】:
-
Func<Type, IRepository>将Type作为输入参数,所以我猜您正在寻找var something = repositoryFactory(typeof(IBlogRepository))? -
是的,这是真的。问题是我不知道如何在 autofac 中注册这样的东西才能正常工作。