【问题标题】:Advice for choice of Design Pattern选择设计模式的建议
【发布时间】:2017-01-09 20:33:11
【问题描述】:

从我记事起,我就一直在使用带有依赖注入的经典 3 层设计模式:

Presentation -> Service class -> Repository,我总是遇到同样的问题:一些大的 Service 类有太多的责任和代码冗余。

这么多年过去了,我的思想已经被这种设计模式毒害了,所以我需要一些建议来转向新的东西。我一直在阅读有关其他设计模式的一些资料,但有很多选择,我看不到从我的存储库模式到许多其他模式之一的转换。

基本示例:

public void CreateMachine(Machine machine)
{
    this.repository.Insert(machine);
}

public void StartMachine(Guid machineid)
{
    Machine machine = repository.GetMachine(machineId);
    machine.Started = true;
    repository.UpdateMachine(machine);

    MachineEvent mEvent = new MachineEvent(machineId);
    mEvent.MachineId = machineId;
    mEvent.EventType = MachineEventEnum.MachineStarted;
    this.eventRepository.Insert(mEvent);

    If (machine.IsBigMachine == true)
    {
         // Do something more
    }        

    // many more objects to create or update...
}

MachineService 类最终将成为 SuperService 类,负责从我的域模型创建和更新许多不同的对象。因为当机器对象发生某些事情时,需要发生许多其他事情。 我通常有更多的服务类,但由于 DI,我无法在服务类之间进行引用。这会产生代码冗余。 对 Repository 模式上瘾者有何建议?

编辑: 我以工作单元结束。在这里查看我的解决方案: https://stackoverflow.com/questions/41548169/rate-my-implementation-of-unif-of-work-with-repository-pattern-and-ef-core

【问题讨论】:

  • 您要解决的问题是什么??
  • RIP 你的实现。

标签: c# .net design-patterns repository-pattern


【解决方案1】:

拥有超类与服务模式或存储库模式或 DI 无关。它可以以任何模式发生在任何地方。这本身就是一个问题,需要相应地处理。它可以通过应用适当的类设计指南来解决,比如 SOLID。此问题的最常见原因是未遵守 SOLID 中的 S。也就是说,如果你设计你的类 - 服务类也不例外 - 具有明确定义的单一目的,你可以避免拥有这些上帝类。

在您的情况下,请考虑将您的课程分解为更小的课程。但是,不要从重构代码开始。从更高的层次开始,例如一些框和箭头(简单的类图)来可视化您将拥有的实体以及它们之间的关系。在此阶段不要深入研究代码,这一点很重要。在此阶段应用 SOLID。一旦考虑了这个阶段,您就可以根据它重构现有代码。如果没有这种高级视图,事情几乎总是会变得复杂。

【讨论】:

  • 一般来说,我会为您的服务命名,以便它们与业务流程保持一致。像 BillingService、ShippingService,...... MachineService 似乎太细了。
  • 感谢您的建议。我很了解 SOLID 原则,但顾名思义,它只是一个原则。我正在寻找一种新模式而不是存储库模式的灵感。我将存储库模式与我的服务类一起使用的方式还不够好,并且在使用可靠原则进行优化方面存在局限性。我最终得到了工作单元模式。我很快会在原始问题中添加一些示例代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
相关资源
最近更新 更多