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



标准方法是实例化工厂和实施工厂呼叫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>

最新更新