Где я должен разместить функциональность для преобразования между типами? - PullRequest
4 голосов
/ 07 марта 2012

У меня есть два экземпляра в приложении, где мне нужно реализовать функциональность для преобразования объекта из одного типа в другой.Один для перехода от объекта домена к другому объекту домена, другой для перехода от объекта домена к XmlDocument.

Первоначально я настроил его так, чтобы включить ToXml() и ToMyOtherDO() в DomainObject1 и DomainObject2 соответственно.

Функциональность в ToXml на самом деле не специфична для реализации DomainObject1 и, вероятно, может существовать где угодно.ToMyOtherDO() обладает функциональностью, очень специфичной для типа, в котором он живет. Оба выполняют преобразование типов, но весьма различны.

У меня вопрос: я разместил эту функцию в правильном месте?Будет ли эта функциональность лучше размещена в классе помощника?Или в каком-то другом месте - возможно, переопределении явного оператора приведения?

Ответы [ 4 ]

4 голосов
/ 07 марта 2012

Обычно я хотел бы добавить такую ​​функциональность в методы расширения .

РЕДАКТИРОВАТЬ : Объяснение
Я обычно предпочитаю помещать такую ​​функциональность в методы расширения, потому что я не чувствую, что класс, который должен быть «преобразован», действительно должен знать, как выполнить преобразование. Это обеспечивает некоторую развязку. Вы можете легко изменить формат вашего XML, не изменяя объект, который вы преобразовываете в XML (особенно полезно, когда объект, который нужно преобразовать, находится в отдельной сборке).

В конечном итоге вы столкнетесь с ситуацией, когда вы захотите преобразовать свой доменный объект во что-то, о чем он на самом деле не должен знать. Например, может быть, вы хотите преобразовать объект вашего домена в Json.NET JObject. Сборке, содержащей ваш доменный объект, не потребуется ссылка на библиотеку Json.NET , если вы использовали методы расширения для обработки преобразования в отдельной сборке.

Методы расширения хороши, особенно когда речь идет о Entity Framework. Код для классов сущностей генерируется автоматически, поэтому вы не можете просто добавить ToXML() или ToJObject() в класс.

Это всего лишь мои предпочтения, и я не всегда использую методы расширения для обработки такого рода функций. Это просто еще один замечательный инструмент в вашем арсенале для решения подобных проблем.

0 голосов
/ 07 марта 2012

Если ToXml не зависит от типа, я бы поступил так, как предложил blachniet и другие, и включил бы его в метод расширения.

Если ToMyOtherDO использует только открытые члены, тогда метод расширенияхорошее место для этого.Однако если ToMyOtherDO требуется закрытый член, то это должен быть тип, из которого он преобразуется.

0 голосов
/ 07 марта 2012

Функция ToXml() должна быть помещена в вспомогательный класс, если она не относится к объекту.

Я бы предложил реализовать ToMyOtherDO () как метод расширения вашего класса, поскольку он специфичен для него.

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

После этого вы сможете вызвать myobject.ToMyOtherDo() (рассматривая myobject как объект MyClass)

0 голосов
/ 07 марта 2012

Я бы поместил его в статический класс как методы расширения.Таким образом, вы можете вызывать его как метод экземпляра, но он не загромождает код вашего доменного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...