gpt4 book ai didi

asp.net-mvc - ASP.NET MVC - 当 SRP 和 DRY 出现冲突时

转载 作者:行者123 更新时间:2023-12-04 12:43:29 25 4
gpt4 key购买 nike

我最简单的 ASP.NET MVC 2 Controller 调用我的服务层并使用 AutoMapper 将 View 模型映射到实体。一切看起来都很棒,没有重复的代码。

但是,当我遇到 的情况时类似 我在平衡单一职责原则 (SRP) 和不要重复自己 (DRY) 方面遇到了麻烦。这方面的一个例子可能是需要添加/编辑车辆,其中一些属性/行为是共享的,而其他属性/行为是特定车辆独有的。

如果我争取真正瘦的 Controller (从而尊重单一职责原则),我最终会在 View 和 Controller 中重复代码,但会有细微的变化(标题、字段标签、字段可见性、下拉值、选择标准等)。

如果我争取不重复的代码,我最终会将太多的逻辑捆绑到一个 Controller / View 中,并且它会变得臃肿。

有哪些方法可以解决 Controller / View 中的重复代码?我不是在谈论可以分解到存储库中的数据库代码。我也不是在谈论可以分解到服务层的业务逻辑。我正在寻找可以帮助我在上述场景中产生最佳解决方案的工具和/或经验法则。

最佳答案

你得到:

  • 部分
  • 渲染 Action
  • Action 过滤器
  • 服务层和助手类(不是 HtmlHelper)
  • 模型活页夹
  • 基本 Controller
  • 依赖注入(inject)

  • 因此,您的 View 可以为相似的部分调用共享的部分/操作,可以通过操作过滤器准备公共(public)数据,可以将数据库访问代码隐藏在智能模型绑定(bind)器中,或者您可以拥有父 Controller ,子 Controller 可以通过特定的调整来覆盖。当然,还有好的旧服务层,您只需将通用代码提取到帮助程序/静态方法中,或者更好的是,注入(inject)特定的实现。

    这不是什么新鲜事,老套路。

    或者,也许,你的 Controller 做了太多的工作?这是上面的东西也有帮助的地方。 ASP.NET MVC 有很好的工具来隐藏基础设施层代码并将其从 Controller 中移开。如果它不是基础设施 - 它可能属于域层。在那里,您可以使用继承、组合和其他 OOP 技巧。

    具体例子。假设您的 Controller 应该以不同的方式设置一些属性。
  • 如果主要是格式化或选择要显示的属性
  • ,您可以使用自己的 View 来执行此操作。
  • 您可以让您的实体拥有虚拟方法 - 即重构代码以将决策移动到域层而不是 Controller
  • 您可以拥有辅助 ViewDetails 类,它们将获取您的实体并根据您的需要获取数据;这是一个肮脏的把戏,但有时很有用;您将决定委托(delegate)给另一个“策略”类
  • 您可以使用操作过滤器将此数据添加到 ViewData,或调整特定的 ViewData.Model 类型(查找它的一些接口(interface))。
  • 您可以拥有抽象 Controller ,其中子级将实现细节传递给基本构造函数,例如 (): base(repository => repository.GetSpecificData())

  • 等等。我实际上在适当的地方使用它们。

    关于asp.net-mvc - ASP.NET MVC - 当 SRP 和 DRY 出现冲突时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4167740/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com