DTO и интерфейсы - PullRequest
       18

DTO и интерфейсы

5 голосов
/ 22 января 2010

Я недавно натолкнулся на этот шаблон (?) В нашем коде и удивился, насколько он полезен, если вообще. У нас есть приложение Spring и интерфейс Flex, использующий BlazeDS. Было решено, что мы используем интерфейсы в наших DTO, например:

Java


public interface ISomeDTO {
       Integer setId();
       void getId(Integer i);
}

public class SomeDTO implements ISomeDTO
{
..
}


Actionscript


public interface ISomeDTO {
       var id:Integer;
}

public class SomeDTO implements ISomeDTO
{
..
}


Что дает вам интерфейс DTO? Это легкие объекты с абсолютно нулевой логикой. DTO имеют смысл, интерфейсы имеют смысл, но не вместе.

Ответы [ 2 ]

3 голосов
/ 22 января 2010

Я не понимаю, почему интерфейсы и DTO не будут работать вместе.

Рассмотрим фабрику / ассемблер, который создает доменные объекты из DTO. Вы можете настроить фабрику с помощью стратегий, чтобы она могла создавать конкретные реализации доменного объекта на основе типа DTO, который ему дан. DTO в идеале должен быть напечатан на интерфейсе здесь. (Это работает и в обратном направлении).

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

3 голосов
/ 22 января 2010

В среде на основе транзакций DTO используются для отделения сущностей вашей базы данных от базового сеанса БД.

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

Именно это происходит, когда вы перенаправляете свои сущности в представление, которое пытается получить доступ к члену. Поскольку обработка транзакций обычно определяется на уровне сервиса, в представлении / контроллере нет активной транзакции.

Чтобы обойти эту проблему, существуют разные подходы:

  • Держите сессию открытой, например, через. механизм фильтра (OpenSessionInViewFilter от Spring), хотя, строго говоря, это анти-шаблон
  • пусть ваши DAO возвращают объекты передачи данных, заполненные необходимыми членами, уже инициализированными

надеюсь, это помогло.

...