【问题标题】:Polluting domain types by implementing infrastructure-related interfaces通过实现与基础设施相关的接口来污染域类型
【发布时间】:2009-11-10 00:52:26
【问题描述】:

进行了大约 30 分钟的搜索,找到了很多相关信息,但没有一个能解决这个特殊问题,希望我没有重复一个常见问题。

我想知道关于在域类型中实现与基础设施相关的接口的普遍共识是什么。我读到的关于 DDD 的所有内容都让我相信这是应该避免的,因为这有损模型的简洁性,这是可以理解的。

但是,我不确定如何解决这个问题。具体来说,我有一个非常适合在我的表示层中使用的域类型,除了我想在需要它实现 IComparable 的控件中显示它的实例。我宁愿不要用这个接口的实现来“污染”我的类型。

我认为(也许是天真的)我的选择是:

  1. 使用数据传输对象 (DTO),让它实现接口,并在我的 表示层。
  2. 我隐约 熟悉基础知识 AOP - 也许有一个合适的 这个领域的技术?
  3. 也许 与选项 2 相关 - 代码“编织”? 我很少知道为什么/何时 考虑一下,但我是不是在碰壁 现在反对吗?
  4. 咬紧牙关, 并实现一点代码 履行合同所需的时间。
  5. 我有一些巫术魔法 从未听说过?

如果有人愿意推荐 2、3 或 5 - 您能否指出一些可能有助于我入门的阅读材料的方向?

提前致谢。

【问题讨论】:

  • 感谢大家的帮助,在考虑了我所有的选项(包括提供的其他选项)之后,我认为我对我的 Model 类的 ViewModel 变体最满意。我认为拥有一个唯一负责“视觉代表”模型类型的类型是明智的。如前所述,它的视觉职责可能(并且可能会)超出我目前实现界面的要求。
  • 这是 WPF 使用的 MVC 变体;我还在常规 WinForms 应用程序中使用了此模型,以确保在影响视图之前将模型更改编组到主 GUI 线程(尽管还有其他解决方案)

标签: c# .net dns aop


【解决方案1】:

实现一个中间“视图模型”类:

  • View 部分知道如何与用户界面对话(数据绑定、IComparable 等)
  • 它包含对模型(域)对象的引用
  • 它公开模型对象的属性(并在必要时中继更改通知)

【讨论】:

    【解决方案2】:
    1. 这会起作用,而且应该没问题。

    2-4。这些实际上是相同的选择。区别在于您如何实现代码以满足合同。代码编织和 AOP 仍在“污染”您的对象,但它们以半自动的方式为您完成工作(即:您只需在对象上放置一个属性,然后在编译后实现它)。但是,无论您是实现对象还是使用 AOP/code gen,最终结果都是一样的。

    1. 我的建议如下:

    大多数时候,任何需要IComparable<T> 的东西都提供了一个传递IComparer<T> 的选项。如果您的控件这样做,这将允许您在数据对象外部实现比较逻辑,并将其传递进去。我会先对此进行调查。

    否则,我的建议是直接在对象中实现IComparable<T>。如果您不想“污染” API,只需显式实施即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 2013-11-11
      • 1970-01-01
      相关资源
      最近更新 更多