c# - 注入(inject)具有与更高级别类相同的构造函数参数的依赖项

标签 c# design-patterns dependency-injection

有时当我设计我的类时,我需要一些具有相似构造函数参数的依赖类。假设我们有

interface IDependency {
    void DoSomething();
}

class DependencyClass : IDependency {
    public DependencyClass(int length) {...}
    ...
}

class MainClass {
    public MainClass(int length, IDependency dependency) {...}
    ...
}

MainClass 需要一个 DependencyClass 的实例,具有相同的 length。我有两种方法来处理它:

  1. 不直接创建 MainClass 的实例,而是始终从工厂获取它们。这样我就可以确保将所需的 IDependency 实例提供给 MainClass 构造函数。

  2. 将工厂接口(interface)(例如 IDependencyFactory)传递给 MainClass 构造函数而不是 IDependency。这样我就可以在我的 MainClass 实现中获得所需的 DependencyClass 实例。

我不确定它们中的任何一个是否是一个不错的选择。在这种情况下是否有最佳实践?

最佳答案

这是一个非常有趣的问题,答案在于您在这里尝试实现的目标。

解决方案 1. 您提供的将使您的 IDependency 成为主工厂接口(interface),所有实例都将使用 IDependency 接口(interface)实现,该接口(interface)将为您提供具有很大的可扩展性 - 您将能够使用 IDependency 接口(interface)在未来初始化具有不同功能的其他类,这是工厂设计模式的经典使用和实现。

解决方案 2. 您提供的将使您的 MainClass 很好,程序的主类,您将处理主类中的实例及其行为以及优势这里是你可以通过 IDependency 管理你所有的实例,而你在 MainClass 中做的唯一一件事就是处理它们的逻辑,MinaClass 将是您的实例传输器和基类的所有基本更改都将在接口(interface) IDependency 中进行,这是 Dependency Inversion 的经典解决方案。

问题仍然存在,您要实现的目标是什么。考虑这个问题和两种可能性,你就有了答案。

关于c# - 注入(inject)具有与更高级别类相同的构造函数参数的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51817115/

相关文章:

java - 如果 bean 试图在其构造函数中加载 Spring 应用程序上下文,会发生什么情况?

c# - 是否可以让 WPF 应用程序打印控制台输出?

c# - 是否可以使用 ADO.NET 锁定 oracle 10g 数据库表?

C# 无法将撇号保存到 XML

dependency-injection - Ninject:使用 Ninject 注册已创建的实例?

dependency-injection - 使用 Autofac 进行方法级属性拦截

c# - 使用数据库上下文时如何指定连接字符串

design-patterns - 状态管理架构

c# - 模式:本地单例与全局单例?

java - 在对象中表示优先级/偏好的最佳方式是什么?