C# 注入没有定义接口的依赖项nLayer

C# 注入没有定义接口的依赖项nLayer,c#,design-patterns,architecture,dependency-injection,service-layer,C#,Design Patterns,Architecture,Dependency Injection,Service Layer,我有一个n层应用程序(DAL、BLL、服务层和UI),我们正在用一个新的UI层重新开发它,该层将使用MVC并在控制器中注入服务类依赖项。 我相信我们可以实现与UI和服务层的松耦合,但是DAL和BLL类继承自现有/旧的代码库,并且没有为每个类定义任何接口。服务类的示例如下所示: public class OrderService : IOrderService { OrderBL _orderBL = new OrderBL(); public void OrderSomethi

我有一个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。
所以我的问题是,您将如何处理这种情况,以仍然实现业务层和服务层之间的松散耦合?

不要修改BLL和DAL的行为。。。只需使用内置工具为它们提取接口:(我认为“直接修改”是指完全重构)

然后,您将拥有一些接口,可以在以后修复BLL和DAL时开始重新实现这些接口


没有其他方法可以绕过紧耦合。如果必须直接实例化对象。。你已经自动将它们耦合起来了。至少在提取接口后,依赖项就会反转(请参阅:依赖项反转原则),并可以将它们注入到服务中。

这并不理想,但您可以为需要从服务层访问的DAL或BLL类编写包装类。例如,在assembly
CoupledAssembly
中有一个类
Coupled

public class Coupled
{
    public int GetAnInteger();
}
public class CoupledAssemblyWrapper : Coupled, INoLongerCoupled
{
}
您可以在保留所有接口的任何位置创建接口
INoLongerCoupled

public interface INoLongerCoupled
{
    int GetAnInteger();
}
以及一个单独程序集中的包装器类,
CoupledAssemblyWrapper
,它引用了
CoupledAssembly

public class Coupled
{
    public int GetAnInteger();
}
public class CoupledAssemblyWrapper : Coupled, INoLongerCoupled
{
}
在IoC容器中注册
CoupledAssemblyWrapper
,当需要修复
Coupled
类时,您可以让它直接实现
INoLongerCoupled
,并去掉包装器


如果包装类是密封的,那么您必须在包装类中更聪明一点,本质上实例化耦合的
副本,并重新实现所有接口方法。

谢谢!!这对我来说也是新的!!