【问题标题】:Where should I place functionality to convert between types?我应该在哪里放置类型之间转换的功能?
【发布时间】:2012-03-25 02:07:48
【问题描述】:

我在应用程序中有两个实例,我需要实现将对象从一种类型转换为另一种类型的功能。一个从一个域对象转到另一个域对象,另一个从一个域对象转到一个 XmlDocument。

我最初设置它的方式是在DomainObject1DomainObject2 中分别包含ToXml()ToMyOtherDO()

ToXml 中的功能并不是真正特定于DomainObject1 的实现,并且可能存在于任何地方。 ToMyOtherDO() 具有非常特定于其所在类型的功能。两者都执行类型转换,但完全不同。

我的问题是,我是否将此功能放置在正确的位置?这个功能会更好地放在帮助类中吗?或者其他地方 - 可能覆盖显式转换运算符?

【问题讨论】:

  • 我认为ToXml()ToMyOtherDO() 没有任何问题,并且会这样做。

标签: c# .net oop c#-4.0


【解决方案1】:

我通常喜欢把这种功能放在extension methods中。

编辑解释
我一般更喜欢将这种功能放在扩展方法中,因为我不觉得需要“转换”的类真的需要知道如何进行转换。这提供了一些解耦。您可以轻松更改 XML 的格式,而无需更改要转换为 XML 的对象(当要转换的对象位于单独的程序集中时尤其有用)。

您最终会遇到一种情况,您希望将域对象转换为它并不真正需要知道的东西。例如,也许您想将域对象转换为 Json.NET JObject。如果您使用扩展方法在单独的程序集中处理转换,则包含您的域对象的程序集不需要对 Json.NET 库的引用。

扩展方法非常棒,尤其是在处理实体框架时。实体类的代码是自动生成的,因此您不能只在类中添加ToXML()ToJObject()

这些只是我的偏好,我并不总是使用扩展方法来处理这种功能。它只是您的武器库中另一个很好的工具,可以解决这些问题。

【讨论】:

  • 您能解释一下为什么您更喜欢将它放在扩展方法中而不是直接放在 DO 中吗?会有什么优势?包含 EM 的类是否特定于这个 DO,或者它是否也可以包含其他类的任意 EM?我真的很想听听你的意见。
【解决方案2】:

我会把它放在一个静态类中作为扩展方法。这样,您可以像调用实例方法一样调用它,但不会弄乱域对象的代码。

【讨论】:

    【解决方案3】:

    如果ToXml() 函数不是特定于对象的,则应将其放在帮助器类中。

    我建议将 ToMyOtherDO() 实现为您的类的扩展方法,因为它是特定于它的。

    public void ToMyOtherDo(this MyClass object1)
    {
        //Do stuff to object1
    }
    

    然后您就可以调用myobject.ToMyOtherDo()(将 myobject 视为 MyClass 对象)

    【讨论】:

    • 该方法的返回类型为void。无法获取转换后的对象。这可能应该返回DomainObject2
    • 这只是一个例子,Sio可以根据自己的喜好调整功能。
    【解决方案4】:

    如果ToXml 不是特定于类型的,我会按照 blachniet 和其他人的建议进行操作,并将其放入扩展方法中。

    如果ToMyOtherDO 只使用公共成员,那么扩展方法是一个好地方。但是,如果ToMyOtherDO 需要私有成员,那么它必须是它要转换的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 2012-08-25
      • 2013-11-27
      • 2019-06-18
      • 2020-07-15
      相关资源
      最近更新 更多