【发布时间】:2017-01-03 06:49:41
【问题描述】:
我在 1 个大系统中有多个子系统。所以每个子系统都有自己的 BAL 和 DAL 实现。现在 BAL(s) 具有重要的逻辑,但 DAL 基本上具有相似的代码,因此我将其重构为一个通用 DAL 类,该类现在用于所有子系统。像这样的:
假设子系统名称为 A 和 B
public class DalA
{
private IGenericDal genericDal;
public DalA( IGenericDal injectedGenericDal)
{
this.genericDal = injectedGenericDal;
}
public bool DoSomeDBWorkForA()
{
return genericDal.CommonDalMethod();
}
}
public class DalB
{
private IGenericDal genericDal;
public DalB(IGenericDal injectedGenericDal)
{
this.genericDal = injectedGenericDal;
}
public bool DoSomeDBWorkForB()
{
return genericDal.CommonDalMethod();
}
}
现在,从单元测试的角度来看,注入通用 DAL 的 DI 部分很重要,因此 BAL(s) 必须注入通用 DAL 对象。因此,现在 BAL 仅仅因为重构和 DI 要求而不必要地了解通用 DAL 对象,理想情况下它不应该这样做(特别是在重构的情况下)。
我的一位朋友还指出,子系统 A 和 B 的 DAL 什么都不做,所以我们可能应该摆脱它们并调用通用 DAL 本身,但我认为它降低了灵活性,因为明天 A 的 DAL可能想要做一些 B 甚至 C 可能不会订阅的日志记录或其他一些特殊操作。
那你们觉得呢?有没有人有更好的重构实现,其中 DI、关注点分离(即 A 的 BAL 只知道 A 的 DAL 而不是通用 DAL 对象)和灵活性(所有子系统具有不同的 DAL)是完整的。
我想到的一种方法是在 A 和 B 的 DAL 中有 2 个构造函数,这样我们就可以在不注入通用 DAL 的情况下从 BAL 调用,而从单元测试中我可以注入通用 DAL 对象。
【问题讨论】:
-
恕我直言,在一个系统(解决方案)中拥有多个子系统是错误的,这些子系统具有系统的所有部分;使用微服务是更好的主意,或者将子系统更改为模块;)。
-
@shA.t 这是一个很好的建议,但在这种情况下,我无法承受由于微服务实施而增加的延迟;)那么在这种情况下,您有什么建议呢?
标签: c# oop dependency-injection