Autofac - 工厂的动态实例化(func<>)

时间:2018-04-26 13:10:37

标签: c# autofac

标准方法是实例化工厂并在工厂调用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中正确注册它。 解决方法或解决方案是什么?

1 个答案:

答案 0 :(得分:2)

注册通用类参数对工厂进行参数化的泛型类。

var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(SomethingClient<>)).AsSelf();

注册:

SomethingClient<SomeParticularType>

解决:

只需将PropertyChanged注入您需要的地方。