标准方法是实例化工厂和实施工厂呼叫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中正确注册。什么是解决方法或解决方案?
注册通用类,该类通过其自己的类型参数来参数化工厂。
public class SomethingClient<T>
{
private readonly Func<T> somethingFactory;
public SomethingClient(Func<T> aSomethingFactory)
{
somethingFactory = aSomethingFactory;
}
public void SomeDynamicScenario()
{
var something = repositoryFactory();
//operate on new object
}
}
注册:
var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(SomethingClient<>)).AsSelf();
解决:
只是您需要的SomethingClient<SomeParticularType>
。