我有一个n层应用程序(DAL,BLL,服务层和UI),我们正在重新开发一个新的UI层,它将使用MVC并在控制器中注入服务类依赖项。 我相信我们可以实现与UI和服务层的松散耦合,但DAL和BLL类继承自现有/旧代码库,并且没有为每个类定义任何接口。服务类的示例如下所示:
public class OrderService : IOrderService
{
OrderBL _orderBL = new OrderBL();
public void OrderSomething(int somethingID) { _orderBL.DoSomething(somethingID); ... }
...
}
正如您所看到的,OrderService直接依赖OrderBL。在我对架构/模式的有限理解中,这似乎违背了DI原则。不幸的是,我们目前无法直接修改BLL和DAL。 所以我的问题是你如何处理这种情况仍然实现业务层和服务层之间的松散耦合?
答案 0 :(得分:1)
不要修改BLL和DAL的行为......只需使用内置工具为它们提取接口:Extracting an Interface - MSDN(通过“直接修改”,我假设你的意思是完全重构)。 / p>
然后,您将拥有可以开始重新实现的接口,以便稍后在轨道上修复BLL和DAL。
这里的紧耦合没有其他办法。如果你必须直接实例化一个对象..你已经自动耦合了它们。至少一旦你提取接口,你的依赖关系就会被反转(参见:Dependency Inversion Princple),它们可以被注入到你的服务中。
答案 1 :(得分:1)
这不太理想,但您可以为需要从服务层访问的DAL或BLL类编写包装类。比如说,你在汇编Coupled
中有一个班级CoupledAssembly
:
public class Coupled
{
public int GetAnInteger();
}
您可以在保留所有界面的地方创建界面INoLongerCoupled
:
public interface INoLongerCoupled
{
int GetAnInteger();
}
以及引用CoupledAssemblyWrapper
的单独程序集CoupledAssembly
中的包装类:
public class CoupledAssemblyWrapper : Coupled, INoLongerCoupled
{
}
向您的IoC容器注册CoupledAssemblyWrapper
,当需要修复Coupled
类时,您可以让它直接实现INoLongerCoupled
,并摆脱包装。< / p>
如果被包装的类是密封的,那么你必须在你的包装类中更聪明一点,基本上实例化Coupled
的副本,并重新实现所有的接口方法。