c# - 国际奥委会 : How to create objects dynamically

标签 c# inversion-of-control

我在理解如何在需要动态创建对象的场景中使用 IoC 时遇到问题。让我们假设我有这个类(class):

abstract class Field {
  public Field( ICommandStack commandStack ) {}
}

abstract class Entity {
  public readonly Collection<Field> Fields { get; }
}

class EntityA {
  public EntityA( ICommandStack commandStack ) {
    Fields.Add( new StringField( commandStack ) );
  }
}

class EntitiyB {
  public EntityB( ICommandStack commandStack ) {
    Fields.Add( new IntField( commandStack ) );
    Fields.Add( new IntField( commandStack ) );
    Fields.Add( new IntField( commandStack ) );
  }
}

所以我的问题是在构造函数中创建字段。我的字段需要 ICommandStack,但实体不需要。他们只获得 ICommandStack 以创建他们的字段。

在每个实体的构造函数中请求字段作为参数可能会更容易。但是单个实体的字段数量可能 >10。我不想创建具有这么多参数的构造函数。

所以我的想法是将 FieldFactory 移交给实体:

class EntityA {
  public EntityA( IFieldFactory fieldFactory ) {
    // create as many fields as needed via the factory
    Fields.Add( fieldFactory.CreateStringField() );
  }
}

至少(对于实体)不必要的 ICommandStack 现在不见了。但是 FieldFactory 是如何创建 Field 的呢?它只能注入(inject) ICommandStack - 但字段的创建仍需通过“new”关键字完成。或者我应该向工厂提供对我的 DI 容器的引用?

什么是好的设计解决方案?

最佳答案

我会使用 FieldFactory 并在工厂中注入(inject)对容器的引用(如果您不满意对容器的强依赖性,则注入(inject)一个抽象它的接口(interface))。

否则一路下去都是乌龟。您需要一些对象在某个时候向容器请求一个新实例。如果你想让你的字段被 DI 注入(inject),那么你需要让容器来构建它们或你。

总而言之,我会选择工厂。

关于c# - 国际奥委会 : How to create objects dynamically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/820520/

相关文章:

inversion-of-control - StructureMap 死了吗?

c# - 如何在 CaSTLe Windsor 的依赖图中进一步指定服务覆盖?

c# - 在 EPPlus 中更改线条系列的颜色

c# - 如何将 RedirectToAction 中的单个参数传递给 ASP .NET MVC 中的不同 Controller ?

c# - 在C#中播放音频时调整平衡

c# - 当关键类需要 session (或其他特定于上下文的变量)时如何设置 IoC

c# - 从后台调用?

c# - 忽略 FileHelpers 中的属性

c# - 如何获取对象是否已在注入(inject)中检索到

c# - 是否可以将 C# DataAnnotations 与 IOC 容器一起使用?