通过 IoC 将依赖项提供给工厂类?

2023-12-07

我有一个工厂类,它决定应该实例化并返回四个可用子类中的哪一个。正如您所期望的,所有子类都实现相同的接口:

public static class FooFactory{
     public IFoo CreateFoo(FooEnum enum){
            switch (enum)
            {
                case Foo1:
                    return new Foo1();
                case Foo2:
                    return new Foo2();
                 case Foo3:
                    return new Foo3(IBar);//has a constructor dependency on IBar
                case Foo4:
                    return new Foo4();
                 default:
                    throw new Exception("invalid foo!");
            }
     }
}

正如您所看到的,其中一个子类在其构造函数中定义了依赖项。

一些兴趣点:

  • 我们使用 Spring.NET 作为我们的 IoC。
  • 的所有子类IFoo是域对象,因此不会被 Spring.NET 实例化。如果可能的话,我希望保持这种状态。
  • 该应用程序有一个手写的数据访问层 (puke),因此这里没有 ORM 发挥作用。

我正在尝试找出如何最好地通过IBar依赖于Foo3 from FooFactory。我感觉这可能是通过 IoC 最好解决的问题,但我不太明白如何解决。我也想保留FooFactory尽可能进行单元测试:即我不希望在我的测试代码中依赖 Spring.NET。

谢谢阅读。


将 FooFactory 更改为抽象工厂并将 IBar 实例注入到具体实现中,如下所示:

public class FooFactory : IFooFactory {
     private readonly IBar bar;

     public FooFactory(IBar bar)
     {
         if (bar == null)
         {
             throw new ArgumentNullException("bar");
         }

         this.bar = bar;
     }

     public IFoo CreateFoo(FooEnum enum){
            switch (enum)
            {
                case Foo1:
                    return new Foo1();
                case Foo2:
                    return new Foo2();
                 case Foo3:
                    return new Foo3(this.bar);
                case Foo4:
                    return new Foo4();
                 default:
                    throw new Exception("invalid foo!");
            }
     }
}

请注意,FooFactory 现在是一个实现 IFooFactory 接口的具体非静态类:

public interface IFooFactory
{
    IFoo CreateFoo(FooEnum emum);
}

在代码中任何需要 IFoo 实例的地方,您都将依赖 IFooFactory 并使用其 CreateFoo 方法来创建所需的实例。

您可以使用任何有价值的 DI 容器来连接 FooFactory 及其依赖项。

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

通过 IoC 将依赖项提供给工厂类? 的相关文章

随机推荐

  • Pandas 列值到列? [复制]

    这个问题在这里已经有答案了 我已经看到了将 Pandas 数据框的列 系列分解为多个列的主题的一些变体 但我一直在尝试做一些事情 但现有的方法并没有真正成功 给定一个像这样的 DataFrame key val id 2 foo orang
  • 检查 iOS 中图像中是否存在子图像[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有 2 个图像 即较小的图像和较大的图像 现在 我想检查较小的图像是否是较大的图像的一部分 或子图像 我不知道如何检查 我想在 iOS 中实现这一切 经过一番研究后 我发现使用
  • 两个div,一个固定宽度,另一个,其余

    我有两个 div 容器 虽然一个需要特定的宽度 但我需要调整它 以便另一个 div 占据剩余的空间 我有什么办法可以做到这一点吗 left float left width 83 display table cell vertical al
  • 我可以在 PHP 中重载方法吗?

    Example 我想要有两个不同的构造函数 并且我不想使用 func get arg 因为这样就看不到可能的参数了 写其中两个是否合法 例如 class MyClass public function construct do someth
  • 方法定义和对象的函数属性之间的区别

    这是我的代码 const x a console log a b function console log b 之间有区别吗a b功能 我在某处读到 a 创建方法的方式较短 但会带来一些问题 仅在您确定永远不会使用递归或将函数传递给事件处理
  • php:是否有充分的理由引用所有数组键/索引?

    我正在运行别人的代码 他们不断地避免转义他们的数组键 例如 row rsCatalogsItems 名称 代替 row rsCatalogsItems 名称 所以我不断地对我接触到的一切做出微小的改变 只是为了应对那一点懒惰 但现在我想知道
  • Matlab条形图:更改条形图的颜色以及条形图和轴之间的间距

    我有一个棘手的问题 我认为不能简单地回答 我有一个很大的数据表 想要保存每两个相应平均值的条形图 我已经使用 for循环 做到了这一点 但我无法为我的条形图设置不同的颜色 也无法在条形图和轴之间设置适当的间距 这是最简单的例子 k 2 5
  • 如何自定义UIPickerView高度?

    如何自定义 UIPickerView 的高度 我希望它比250高 我已完成以下操作 但无法设置给定高度 void pickerview id sender pickerView UIPickerView alloc initWithFram
  • 为什么 __getattr__ 能够在 Python 2.x 中处理内置运算符重载,但不能在 Python 3.x 中处理?

    在 python 2 x 中 采用以下类 class Person def init self name self name name def myrepr self return str self name def getattr sel
  • 初始化对象时,{0} 是什么意思?

    When 0 用来初始化一个对象 什么意思呢 我找不到任何参考资料 0 任何地方 并且由于花括号 谷歌搜索没有帮助 示例代码 SHELLEXECUTEINFO sexi 0 what does this do sexi cbSize siz
  • Selenium:如何将值从field1复制到field2?

    我们正在 Firefox 中使用 Selenium IDE 录制测试 我们需要将值从只读字段复制到输入字段 有没有直接的方法可以引用该字段 或者我是否必须存储和使用它 举个例子就太好了 Thanks 您将需要两个命令 一个用于存储 一个用于
  • Java 创建新的 ObjectInputStream 块

    我正在尝试使用从 Socket 检索的 InputStream 创建一个新的 ObjectInputStream 这是我的代码 这是我的 MessageGetterSender 类的构造函数 程序未到达检查点 4 public Messag
  • Symfony2实体注释中的可配置参数

    我正在尝试跨多个数据库 其中一个属于遗留应用程序 创建一个联接 如教义博客 但是 该示例建议将数据库名称直接硬编码到模式中 出于显而易见的原因 我想避免这样做 有没有办法读取定义的参数parameters ini or config yml
  • LD_PRELOAD可以用来加载不同版本的glibc吗?

    角色阵容 big old app链接到旧版本glibc say glibc 2 12 我无法做任何事情来改变这一点 cute new addon o链接到较新的版本 glibc 2 23 This glibc 2 23位于非标准路径中 因为
  • 是否可以用交替的垂直列填充 DataGridView?

    我需要显示混合 硬编码 字符串和数据库中的数据的数据 具体来说 每个偶数列都包含不是来自数据库的字符串值 每个奇数列都包含数据 例如 第 1 列将包含数据库中的值 1 到 12 因此前两列看起来像这样 并且相同的模式重复多次 00 00 B
  • 如何修复nodejs抛出错误; ^ 错误:ENOENT:没有这样的文件或目录,请打开

    这就是我的输出的样子 我从以前的类似问题中用尽了很多方法 但没有一个对我的情况有效 我对 Node js 非常陌生 所以任何建议都会非常有帮助 C Users pushp Desktop factor gt snarkjs help int
  • Renderscript c风格指针使用性能问题

    在渲染脚本中 我使用绑定指针来迭代大图像 问题在于数组访问性能 for int i 0 i lt channels i sum input i input size mulValue 例如 当 input size 为 12288 时 完成
  • Cocoa 中的 XML-RPC 服务器

    我需要在 iPhone 上创建一个 XML RPC 服务器用于测试目的 有我可以利用的图书馆吗 查看eczarny xmlrpc在 github 上 它带有一个测试服务器
  • 在 Java 中何时使用列表而不是数组?

    在Java中 什么时候优先使用List而不是Array 我认为这个问题是相反的 什么时候应该使用数组而不是列表 只有您有特定的理由才这样做 例如 项目限制 内存问题 这并不是一个很好的理由 等 列表更容易使用 我认为 并且具有更多功能 注意
  • 通过 IoC 将依赖项提供给工厂类?

    我有一个工厂类 它决定应该实例化并返回四个可用子类中的哪一个 正如您所期望的 所有子类都实现相同的接口 public static class FooFactory public IFoo CreateFoo FooEnum enum sw