【问题标题】:Inject Dependencies without Interfaces Defined nLayer在未定义接口的情况下注入依赖关系 nLayer
【发布时间】:2014-02-04 14:53:33
【问题描述】:

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

【问题讨论】:

    标签: c# design-patterns architecture dependency-injection service-layer


    【解决方案1】:

    不要修改 BLL 和 DAL 的行为...只需使用内置工具为它们提取接口:Extracting an Interface - MSDN(通过“直接修改”,我假设您的意思是完全重构)。

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

    这里没有其他方法可以解决紧密耦合。如果你必须直接实例化一个对象......你已经自动耦合了它们。至少一旦您提取接口,您的依赖关系就会反转(请参阅:依赖反转原则)并且它们可以被注入到您的服务中。

    【讨论】:

    • 谢谢!!这对我来说也是新的!
    【解决方案2】:

    这并不理想,但您可以为需要从服务层访问的 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,并摆脱包装器。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2012-11-28
      相关资源
      最近更新 更多