我是模拟和依赖注入的新手,需要一些指导。
我的应用程序使用典型的 N 层架构,其中 BLL 引用 DAL,UI 引用 BLL 但不引用 DAL。很直接。
可以说,例如,我有以下课程:
class MyDataAccess : IMyDataAccess {}
class MyBusinessLogic {}
每个都存在于一个单独的程序集中。
我想在 MyBusinessLogic 的测试中模拟 MyDataAccess。因此,我在 MyBusinessLogic 类中添加了一个构造函数来获取依赖注入的 IMyDataAccess 参数。但是现在当我尝试在 UI 层上创建 MyBusinessLogic 的实例时,它需要对 DAL 的引用。
我想我可以在 MyBusinessLogic 上定义一个默认构造函数来设置一个默认的 IMyDataAccess 实现,但这不仅看起来像代码味道,它实际上并没有解决问题。我仍然在签名中有一个带有 IMyDataAccess 的公共构造函数。所以 UI 层仍然需要引用 DAL 才能编译。
我正在尝试的一种可能的解决方案是使用 IMyDataAccess 参数为 MyBusinessLogic 创建一个内部构造函数。然后我可以使用测试项目中的访问器来调用构造函数。但是还是有那种味道。
这里的常见解决方案是什么。我一定是做错了什么。我该如何改进架构?