具有公共代码的多个类的重构实现(With DI)



我在一个大系统中有多个子系统。因此,每个子系统都有自己的BAL和DAL实现。现在BAL有重要的逻辑,但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必须注入通用DAL对象。因此,现在BAL仅仅因为重构和DI需求而不必要地意识到通用DAL对象,而理想情况下它不应该意识到这一点(特别是在重构的情况下)。

此外,我的一个朋友指出,子系统A和B的DAL什么都没做,所以我们可能应该去掉它们,并将其称为通用DAL本身,但在我看来,这降低了灵活性,因为明天A的DAL可能想做一些日志记录或其他一些B甚至C可能不会订阅的特殊操作。

你们怎么看?有没有人有一个更好的重构实现,其中DI、关注点的分离(即a的BAL只知道a的DAL,而不是通用的DAL对象)和灵活性(所有子系统都有不同的DAL)完好无损。

我想到的方法之一是在A和B的DAL中有两个构造函数,这样我们就可以在不注入通用DAL的情况下从BAL调用,而在单元测试中我可以注入通用DAL对象。

子系统A和B的DAL什么都不做,所以我们可能应该去掉它们,并调用通用DAL本身,但在我看来,这降低了灵活性,因为明天A的DAL可能想做一些日志记录或其他一些B甚至C可能不订阅的特殊操作。

类应该打开以进行扩展,但关闭以进行修改。这意味着添加日志并不意味着你需要更改A的DAL。你应该能够通过创建一个包装通用DAL的装饰器来做到这一点。其他贯穿各领域的问题也是如此。

因此,这种灵活性并不是IMO保留额外间接层的有力论据。

最新更新