【问题标题】:Dependency Injection for factory with parameters resolved at creation time工厂的依赖注入,参数在创建时解析
【发布时间】:2020-05-04 12:27:54
【问题描述】:

这是我希望在我的应用程序中能够执行的操作:

public void BusinessLogic (IFactory workerFactory)
{
  string specificObjectType = ... // not known in advance
  IWorkerObject workerObject = workerFactory.CreateByType(specificObjectType);
  workerObject.DoActualWork();
}

换句话说,我想要一个能够按需生成各种IWorkerObject 实现的实际工厂,并且我希望该工厂是可注入的。理想情况下,Factory 本身也能够从服务容器中获取这些实现对象:

public class WorkerFactory
{
  public WorkerFactory (IServiceContainer ...)
  { ... }

  public IWorker CreateByType (string type)
  {
    return ...; // a thing that can be provided by the service container
  }
}

原因是我希望能够创建(例如)SteelWorkerCopperWorkerAluminumWorker,具体取决于 specificObjectType 值所代表的金属类型。这对我来说似乎是一种正常的工厂模式,但我不知道如何使类可注入为其提供直到创建时才解析的参数。

如果这可以通过 Unity 完成,那就太好了。如果我需要解决它或使用其他 DI 框架,那也没关系。

【问题讨论】:

  • 你考虑过使用泛型IWorker CreateByType<T>() where T : IWorker
  • 我在创建时可用的东西是像“Steel”或“Copper”这样的字符串,而IWorker 实现本身在本质上并不是通用的;即,SteelWorker 类与 CopperWorker 类非常不同。所以这充其量只是将问题推到解决T,这是我已经遇到的问题。
  • 你为什么要这个?

标签: c# .net-core dependency-injection


【解决方案1】:

您可以将 IServiceScopeFactory 注入到 IFactory 中

using (var scope = _serviceScopeFactory.CreateScope())
{
    if(criteriaA)
    {
        return scope.ServiceProvider.GetRequiredService<WorkerA>();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2023-03-20
    • 2011-09-10
    相关资源
    最近更新 更多