【问题标题】:How can I get my business objects layer to use the management layer in their methods?如何让我的业务对象层在他们的方法中使用管理层?
【发布时间】:2012-04-03 11:25:00
【问题描述】:

我在 VS2010 中有一个包含多个项目的解决方案,每个项目在我的应用程序中构成一个层。我有当前是没有方法的对象的业务实体,并且我有一个管理层引用其项目中的业务实体层。我现在认为我的应用程序设计得很糟糕,并且想将方法从帮助类(位于另一层中)移动到我将在业务实体本身中创建的方法中。

例如,我有一个 VirtualMachine 对象,它使用一个辅助类调用 Reboot() 方法,该方法将请求传递给管理层。静态管理器类与重新启动 VM 的 API 对话。我想将 Reboot() 方法移动到 VirtualMachine 对象中,但我需要引用管理层:

public void Reboot()
{  
    VMManager.Reboot(this.Name);
}

因此,如果我在我的实体项目中添加对我的管理项目的引用,我会收到循环依赖错误,这是应该的。我该如何解决这种情况?我需要在实体层和管理层之间再增加一层吗?或者,我应该忘记它并保持原样。

应用程序现在工作正常,但我担心我的设计不是特别以 OOP 为中心,我想纠正这个问题。

【问题讨论】:

    标签: c# .net oop design-patterns circular-dependency


    【解决方案1】:

    你是对的,你不应该做循环引用,做另一个层可能只是帮助你避免循环引用错误,但如果我理解正确的话,它仍然是一个循环引用。

    我会坐下来,画一张地图,方法应该只分层调用。这是程序“底部”最通用的方法,你越专业,你应该把它放在层次越高。

    您正在制作的程序的 API 应该位于此层次结构的底部。

    您可能不需要重新设计整个项目。但听起来你可以帮助自己想象结构。

    【讨论】:

      【解决方案2】:

      管理层(因为它是负责工作的层)似乎不适合业务层的顶部。而实际上我们在业务层之上并没有这样的层,我们只是在业务层的顶部有外观层 - 这与您需要的不一样。

      从我在您的项目中可以看到,您需要业务层使用助手类的服务:

      // Business layer
      public class VirtualMachineManager
      {
         IRebooter _rebooter;
         public class(IRebooter rebooter)
         {
            _rebooter = rebooter;
         }
      }
      
      // helper class
      public class Rebooter : IRebooter 
      {
         ....
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 2011-07-10
        • 2011-02-02
        • 1970-01-01
        • 2013-11-15
        • 2014-09-30
        相关资源
        最近更新 更多