c# – 依赖注入 – 当你有很多依赖关系时该怎么办?
我有一个依赖于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 – 访问数据库的类 还有许多其他的我想要摆脱,但是那些真的是必要的,我没有看到任何避免它们的方法. 编辑 经过一些重构,我有7个依赖关系(从10开始).但我有4个DAO对象: CustomerDAO 是否正确创建另一个类叫做MyProjectDAO并将这些DAOS注入到它上面?这样我将只有一个DAO类可以聚合项目的所有DAO对象.我不认为这是一个好主意,因为它违反了单一责任原则.我对吗? 解决方法
你能证明(给自己)为什么这个课程依赖于10个其他类?您有用于将这些类的一部分组合在一起的成员变量吗?如果是这样,这表明这个类应该被分解,以便提取的类将取决于子集,并且将这种状态结合在一起的变量在提取的类中.有10个依赖关系,这个类可能只是变得太大了,而且还需要内部的分解.
关于你的最后一句话的注释:这样的顺序依赖也可以是一个代码的气味,所以很可能不要在你的界面中公开它.实际上,考虑到订单要求是否因为需要以特定的顺序进行操作(这是算法或协议的复杂性),还是因为您已将您的类设计为相互依赖.如果复杂性是由于您的设计造成的,重构可能会消除有序依赖. 如果你不能重构(复杂性是必不可少的,你手上有一个可怕的协调问题),那么你可以抽象丑陋,并让这个类别的用户被屏蔽(建设者,工厂,注射器等). 编辑:现在我已经考虑过了,我不相信你的算法或协议的基本复杂性不能被抽象出来(尽管可能是这样).根据您的具体问题,可以通过策略模式或观察者模式(事件侦听器)更好地解决这些依赖类的操纵的相似之处.您可能必须将这些类包装在类中,使其适应与当前暴露的接口略微不同的接口.你必须评估在这个怪物类中的代码变得更加可读(yay)的折中,牺牲了多达10个类的项目(boo). 我还想提出一个附录来抽象这个类的构造.看起来重要的是依赖于这个类的任何类都使用依赖注入模式.这样,如果您使用建筑工厂,注射器等,您不会意外地剥夺使用DI图案的一些好处(最重要的是我可以用替代模拟物体进行测试) . 编辑2(根据您的编辑): 我的第一个想法是“什么,没有伐木依赖? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |