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

C# Autofac-工厂的动态实例化(func<;>;),c#,autofac,C#,Autofac,标准方法是实例化工厂,并在工厂调用Resolve()的实现中使用。我不想把我的类绑定到容器上,因为这似乎是一种不好的做法 标准方法: T IDataRepositoryFactory.GetDataRepository<T>() { return MyProject.Bootstrapper.Container.Resolve<T>(); } 但我不知道如何在autofac中正确注册。 此问题的解决方法或解决方案是什么?注册泛型类

标准方法是实例化工厂,并在工厂调用Resolve()的实现中使用。我不想把我的类绑定到容器上,因为这似乎是一种不好的做法

标准方法:

    T IDataRepositoryFactory.GetDataRepository<T>()
    {
        return MyProject.Bootstrapper.Container.Resolve<T>();
    }
但我不知道如何在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
    }
}
公共类SomethingClient
{
私有只读Func somethingFactory;
公共Something客户端(Func aSomethingFactory)
{
某物工厂=某物工厂;
}
public void SomeDynamicScenario()
{
var something=repositoryFactory();
//操作新对象
}
}
注册:

var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(SomethingClient<>)).AsSelf();
var builder=newcontainerbuilder();
builder.RegisterGeneric(typeof(SomethingClient)).AsSelf();
解决:


只需在需要的地方注入
SomethingClient

注册泛型类,该类通过自己的类型参数对工厂进行参数化

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
    }
}
公共类SomethingClient
{
私有只读Func somethingFactory;
公共Something客户端(Func aSomethingFactory)
{
某物工厂=某物工厂;
}
public void SomeDynamicScenario()
{
var something=repositoryFactory();
//操作新对象
}
}
注册:

var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(SomethingClient<>)).AsSelf();
var builder=newcontainerbuilder();
builder.RegisterGeneric(typeof(SomethingClient)).AsSelf();
解决:


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

函数将
Type
作为输入参数,因此我猜您正在寻找
var something=repositoryFactory(typeof(IBlogRepository))
?是的,这是真的。问题是我不知道如何在autofac中注册这样的东西才能正常工作。
Func
Type
作为输入参数,所以我猜您正在寻找
var something=repositoryFactory(typeof(IBlogRepository))
?是的,这是真的。问题是我不知道如何在autofac中注册这样的东西才能正常工作。我不明白它是如何解决这个问题的。我希望拥有与我介绍的工厂方法相同的功能。在某些情况下,我可能需要在SomethingManager的方法调用中使用2或3个不同的存储库。按照你提出的方法,我看不出有什么办法可以做到这一点。我已经修改了我帖子中的代码,使之更为合适。SomethingManager可以是wcf管理器类或web api控制器。如果没有容器参与,则无法完成此操作。但是,您不必引用全局静态的东西—JU注入IComponentContext而不是factory,并从中解决您需要的内容。是的,它成功了!:D我与我的类中的容器没有关联,因此我避免使用服务定位器模式。我试图做的正是本文所描述的:几乎完全相同,只是示例中的参数类型不同。Func真的不可能吗?我认为这正是它存在的全部意义……”“我和我的类中的容器没有任何联系”——嗯。。。我不想打断你,但实际上IComponentContext是容器的纽带。:)它只是没有静态服务定位器强大,但它仍然是Autofac的一部分。您想做的是编写自己的自定义工厂,使用IComponentContext—它将是您从特定DI容器中提取的内容。我不明白它是如何解决这个问题的。我希望拥有与我介绍的工厂方法相同的功能。在某些情况下,我可能需要在SomethingManager的方法调用中使用2或3个不同的存储库。按照你提出的方法,我看不出有什么办法可以做到这一点。我已经修改了我帖子中的代码,使之更为合适。SomethingManager可以是wcf管理器类或web api控制器。如果没有容器参与,则无法完成此操作。但是,您不必引用全局静态的东西—JU注入IComponentContext而不是factory,并从中解决您需要的内容。是的,它成功了!:D我与我的类中的容器没有关联,因此我避免使用服务定位器模式。我试图做的正是本文所描述的:几乎完全相同,只是示例中的参数类型不同。Func真的不可能吗?我认为这正是它存在的全部意义……”“我和我的类中的容器没有任何联系”——嗯。。。我不想打断你,但实际上IComponentContext是容器的纽带。:)它只是没有静态服务定位器强大,但它仍然是Autofac的一部分。您要做的是编写自己的自定义工厂,使用IComponentContext—它将是您从特定DI容器中的抽象。
var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(SomethingClient<>)).AsSelf();