IoC:如何动态创建对象

2023-12-23

我无法理解如何在需要动态创建对象的场景中使用 IoC。假设我有这样的课程:

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。我不想创建带有这么多参数的构造函数。

所以我的想法是将一个现场工厂移交给实体:

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

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

这里有什么好的设计解决方案?


我将使用 FieldFactory 并通过对容器的引用注入工厂(或者如果您不满意对容器的强烈依赖,则注入抽象它的接口)。

不然的话,就只能是乌龟了。您需要一些对象在某个时刻向容器请求新实例。如果您希望您的字段被 DI 注入,那么您需要要求容器来构建它们或您。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IoC:如何动态创建对象 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 显示异常时的自定义错误消息:从客户端检测到潜在危险的 Request.Form 值

    我在我的 Web 应用程序中使用 ASP NET 的登录控件 当发生此异常时 我想在标签上显示一种有趣的错误类型System Web HttpRequestValidationException A potentially dangerou
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • 设置可拖动div的位置

    我正在使用 jQuery 和 JQuery ui 做一个小应用程序 我已经定义了一个可拖动的 div 它工作得很好 但我想在单击按钮时设置 div 的位置 我在 stackOverflow 中阅读这里来执行此操作 element posit
  • 更改 .csproj 中构建设置的程序集名称

    我有一个应用程序 我想通过命令行使用 ClickOnce 发布 我有测试版和现场版 应该允许同时安装两者 这意味着我需要更改其中一个版本的汇编名称 最好还有产品名称 我想在构建设置中执行此操作 我已经设法进行了一些构建设置 效果很好 但我不
  • 在 C# 中实现自定义异常的行业标准最佳实践是什么?

    在 C 中实现自定义异常的行业标准最佳实践是什么 我查过谷歌 有很多推荐 但我不知道哪些更可信 如果有人有权威文章的链接 那也会有帮助 创建自定义异常的标准是源自例外 http msdn microsoft com en us librar
  • Java如何绘制和填充有孔的多边形

    我目前正在尝试在 Java 中绘制并填充一个有洞的多边形 通常这不会是一个大问题 因为我会绘制外环 然后用背景颜色绘制内环 但问题是 多边形显示在应该通过孔 看到 的图像上方 我正在用 Java 编写代码并使用JTS 拓扑套件 http t
  • 使用 AngularJS 删除 DOM 元素

    我正在尝试根据当前位置路径删除导航栏 这是我到目前为止所拥有的 angular module myModule controller MainController function location document if location
  • 多语言安卓应用程序?

    我必须用 3 种语言制作我的 Android 应用程序 即德语 英语和荷兰语 我在我的 Android 应用程序名称中创建了三个文件夹values de and values nl在 res 目录中 现在 当用户选择特定语言时 我执行以下代
  • 如何使用 gitlab-ci 中的托管标识进行身份验证,将 docker 容器从 gitlab 注册表推送到 Azure Web 服务?

    我研究了将 docker 镜像从 gitlab 容器注册表推送到 azure 资源的方法 将 Docker 映像从 gitlab ci 推送到 Azure 容器注册表 https stackoverflow com questions 49
  • 如何将 git 提交消息保存到文件中?

    想要提交 修复错误并将更改发送到 GIT 存储库 但消息数超出了 Unix 命令行中显示的行数 因此我无法读取错误消息 如何将 GIT 提交消息保存到文件或可能增加 Unix 命令行上显示的行数 似乎在这个 GIT 构建中使用了钩子 它显示
  • 如何从Android中的CalendarView中选择日期范围?

    我需要从 android 的 CalenderView 中选择多次日期 任何人都可以帮助我做同样的事情吗 例子 让我们看看附图 如果我们将图像中的日历视为 android 的日历视图 我需要选择从 16 日到 20 日的所有日期 据我所知C
  • Yii2,抛出NotFoundException时发生错误

    我有一个在应用程序的 beforeAction 事件上运行的简单代码 on beforeAction gt function event throw new yii web NotFoundHttpException The request
  • 如何通过索引将项目添加到 Laravel Eloquent Collection 中?

    我尝试了以下方法 但它不起作用 index 2 collection gt put index item4 例如 如果 collection 看起来像这样 collection item1 item2 item3 我想结束 collecti
  • Gradle 在 bin 目录中创建重复的启动脚本

    我正在尝试通过 gradle 创建多个启动脚本文件 但不知何故 一个特定的启动脚本文件正在重复 startScripts enabled false run enabled false def createScript project ma
  • Java 泛型放在 Map>

    有没有办法以类型安全的方式进行以下实现 public void myMethod Map
  • 如何比较 Svelte 3 中的 Prop 变化

    Svelte 3 中是否有一种机制可以在渲染之前比较组件内的 prop 更改 类似于 反应从Props获取DerivedState https reactjs org docs react component html static get
  • 车把模板中 href 标签中的 Ember 插值

    我正在尝试建立一个到谷歌地图的简单链接 并将动态地址插入到 href 字段中 我已经尝试过下面的代码以及大量其他乱七八糟的东西 但没有运气 如何在车把 href 字段中插入动态 ember 字符串 我正在使用 ember 导轨和车把 如果我
  • 将二进制路径添加到 emacs $PATH

    我尝试了以下方法 setenv PATH concat getenv PATH mybin setq exec path append exec path mybin 但这从来没有奏效 我试过M 并键入二进制名称之一 并且在使用二进制名称进
  • Select2:init后如何设置数据?

    我需要在初始化 select2 后设置一个数据数组 所以我想做这样的事情 var select select select2 select data id 1 text value1 id 1 text value1 但我收到以下错误 当附
  • 连接字符串和实体框架的问题

    我有一个数据库 sql 2008 mdf 文件 一个带有 edmx 文件的类库项目 是使用向导创建的 所以连接字符串也是由向导制作的 该项目位于 teamfoundation 服务器上 我可以在编码时使用所有向导创建的对象 但是当我运行程序
  • DisplayFormat 未应用于十进制值

    我有一个模型属性 我正在尝试使用 EditorFor 模板进行渲染 并且我正在尝试使用 DisplayFormat 属性应用格式 然而 它根本不起作用 它完全被忽略了 这是我的模板 model System Decimal Html Tex
  • IoC:如何动态创建对象

    我无法理解如何在需要动态创建对象的场景中使用 IoC 假设我有这样的课程 abstract class Field public Field ICommandStack commandStack abstract class Entity