【问题标题】:Autofac - Dynamic Instantiation of a factory (func<>)Autofac - 工厂的动态实例化 (func<>)
【发布时间】:2018-04-26 13:10:36
【问题描述】:

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

【问题讨论】:

  • Func&lt;Type, IRepository&gt;Type 作为输入参数,所以我猜您正在寻找var something = repositoryFactory(typeof(IBlogRepository))
  • 是的,这是真的。问题是我不知道如何在 autofac 中注册这样的东西才能正常工作。

标签: c# autofac


【解决方案1】:

注册通过自己的类型参数参数化工厂的泛型类。

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&lt;SomeParticularType&gt;

【讨论】:

  • 我不明白它是如何解决问题的。我希望拥有与我提出的工厂方法相同的功能。在某些情况下,我可能需要在 SomethingManager 的方法调用中使用 2 或 3 个不同的存储库。使用您提出的方法,我看不出如何做到这一点。我已将帖子中的代码更改为更合适。 SomethingManager 可以是 wcf 管理器类或 Web api 控制器。
  • 这在没有容器参与的情况下无法完成。但是,您不必引用全局静态的东西 - 只需注入 IComponentContext 而不是工厂并从中解决您需要的内容。
  • 是的,成功了! :D 我与班级中的容器没有联系,所以我避免使用服务定位器模式。我试图完全按照本文中的描述进行操作:jahyacode.blogspot.com/2012/03/… 它几乎相同,只是参数的类型(在示例中)不同。 Func 真的不可能吗?我认为它的这种确切用途是它存在的全部意义......
  • “我的班级与容器没有任何联系” - 好吧......我不想告诉你,但实际上 IComponentContext 与容器的联系。 :) 它没有静态服务定位器那么强大,但它仍然是 Autofac 的一部分。您要做的是编写自己的使用 IComponentContext 的自定义工厂 - 这将是您对特定 DI 容器的抽象。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多