加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 依赖注入 – 当你有很多依赖关系时该怎么办?

发布时间:2020-12-15 06:09:34 所属栏目:百科 来源:网络整理
导读:我有一个依赖于10个其他类的A类.根据依赖注入模式,我应该通过其构造函数传递A的所有依赖关系. 所以让我们假设这个构造函数(当然这不是一个工作或实际的代码,因为我不允许在这里发布真正的代码) public ClassA(ClassB b,ClassC c,ClassD d,ClassE e,ClassF f,
我有一个依赖于10个其他类的A类.根据依赖注入模式,我应该通过其构造函数传递A的所有依赖关系.

所以让我们假设这个构造函数(当然这不是一个工作或实际的代码,因为我不允许在这里发布真正的代码)

public ClassA(ClassB b,ClassC c,ClassD d,ClassE e,ClassF f,ClassG g,ClassH h,ClassI i) {
  this.b = b;
  this.c = c;
  this.d = d;
  this.e = e;
  this.f = f;
  this.g = g;
  this.h = h;
  this.i = i;
}

我已经阅读了Martin Fowler的关于重构的书,其中有一个具有很多参数的方法是一个代码气味,不应该发生.

我的问题是:当我们在谈论DI时,这样可以吗?是否有更好的注入依赖方式,而不会破坏Martin Fowler的规则?

我知道我可以通过属性传递依赖关系,但这可能会导致错误,因为没有人真的确定应该通过什么来使类工作.

编辑

感谢您的所有答案.我将尝试演示一些A类依赖:

1 – 访问数据库的类
2 – 另一个类访问另一个数据库(是的,我需要对两个数据库执行操作)
3 – 通过电子邮件发送错误通知的课程
4 – 加载配置的类
5 – 作为一些操作的定时器的类(可以避免这个)
6 – 具有业务逻辑的课程

还有许多其他的我想要摆脱,但是那些真的是必要的,我没有看到任何避免它们的方法.

编辑

经过一些重构,我有7个依赖关系(从10开始).但我有4个DAO对象:

CustomerDAO
ProcessDAO
用ProductsDao
CatalogDAO的

是否正确创建另一个类叫做MyProjectDAO并将这些DAOS注入到它上面?这样我将只有一个DAO类可以聚合项目的所有DAO对象.我不认为这是一个好主意,因为它违反了单一责任原则.我对吗?

解决方法

你能证明(给自己)为什么这个课程依赖于10个其他类?您有用于将这些类的一部分组合在一起的成员变量吗?如果是这样,这表明这个类应该被分解,以便提取的类将取决于子集,并且将这种状态结合在一起的变量在提取的类中.有10个依赖关系,这个类可能只是变得太大了,而且还需要内部的分解.

关于你的最后一句话的注释:这样的顺序依赖也可以是一个代码的气味,所以很可能不要在你的界面中公开它.实际上,考虑到订单要求是否因为需要以特定的顺序进行操作(这是算法或协议的复杂性),还是因为您已将您的类设计为相互依赖.如果复杂性是由于您的设计造成的,重构可能会消除有序依赖.

如果你不能重构(复杂性是必不可少的,你手上有一个可怕的协调问题),那么你可以抽象丑陋,并让这个类别的用户被屏蔽(建设者,工厂,注射器等).

编辑:现在我已经考虑过了,我不相信你的算法或协议的基本复杂性不能被抽象出来(尽管可能是这样).根据您的具体问题,可以通过策略模式或观察者模式(事件侦听器)更好地解决这些依赖类的操纵的相似之处.您可能必须将这些类包装在类中,使其适应与当前暴露的接口略微不同的接口.你必须评估在这个怪物类中的代码变得更加可读(yay)的折中,牺牲了多达10个类的项目(boo).

我还想提出一个附录来抽象这个类的构造.看起来重要的是依赖于这个类的任何类都使用依赖注入模式.这样,如果您使用建筑工厂,注射器等,您不会意外地剥夺使用DI图案的一些好处(最重要的是我可以用替代模拟物体进行测试) .

编辑2(根据您的编辑):

我的第一个想法是“什么,没有伐木依赖?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读