标准方法是实例化工厂并在工厂调用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中正确注册它。 解决方法或解决方案是什么?
答案 0 :(得分:2)
注册通用类参数对工厂进行参数化的泛型类。
var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(SomethingClient<>)).AsSelf();
注册:
SomethingClient<SomeParticularType>
解决:
只需将PropertyChanged
注入您需要的地方。