Как избежать объявления полей базы данных дважды, один раз в базе данных, один раз в хранилище / модели? - PullRequest
4 голосов
/ 15 ноября 2010

Я недавно начал читать Pro ASP.NET MVC Framework .

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

Но в этом есть проблема необходимости объявлять себя все поля для каждой таблицы в базе данных дважды: один раз в фактической базе данных и один раз в коде C # вместо автоматической генерации C #классы доступа к данным с ORM.

Я понимаю, что это отличная практика, и она позволяет использовать TDD, который также выглядит потрясающе.Но мой вопрос:

Разве нет обходного пути, когда нужно объявлять поля дважды: как в базе данных, так и в коде C #?Разве я не могу использовать что-то, что автоматически генерирует код C #, но все же позволяет мне выполнять TDD, не создавая вручную всю бизнес-логику в C # и не создавая хранилище (и поддельное тоже) для каждой таблицы?

Ответы [ 3 ]

4 голосов
/ 15 ноября 2010

Я понимаю, что вы имеете в виду: большинство классов POCO, которые, как вы заявляете, извлекают из репозиториев, во многом похоже на классы, которые автоматически генерируются вашей средой ORM.Поэтому заманчиво повторно использовать эти классы доступа к данным, как если бы они были бизнес-объектами.

Но по моему опыту, данные, которые мне нужны в части бизнес-логики, редко бывают равны точно как классы доступа к данным.Обычно мне либо нужно какое-то конкретное подмножество данных из объекта данных, либо какая-то комбинация данных, получаемых путем объединения нескольких объектов данных.Если я захочу потратить еще две минуты на то, чтобы на самом деле создать POCO, который я имею в виду, и создать интерфейс для представления методов репозитория, которые я планирую использовать, я обнаружу, что код в конечном итоге становится намного проще для рефакторинга, когда мне нужноизменить бизнес-логику.

3 голосов
/ 15 ноября 2010

Если вы используете Entity Framework 4, вы можете автоматически генерировать объект POCO из базы данных.(http://blogs.msdn.com/b/adonet/archive/2010/01/25/walkthrough-poco-template-for-the-entity-framework.aspx)

Затем вы можете реализовать универсальный IRepository и его универсальный SqlRepository, это позволит вам иметь хранилище для всех ваших объектов. Это объясняется здесь: http://msdn.microsoft.com/en-us/ff714955.aspx

Это чистый способ достичь того, чего вы хотите: вы объявляете свой объект только один раз в своей базе данных, генерируете его автоматически и можете легко получить к нему доступ из своего репозитория (кроме того, вы можете выполнить IoC и модульный тест :))

Я рекомендую вам прочитать второе издание этой книги, которое написано из чистого золота и дополнено новыми функциями, представленными в MVC 2 http://www.amazon.com/ASP-NET-Framework-Second-Experts-Voice/dp/1430228865/ref=sr_1_1?s=books&ie=UTF8&qid=1289851862&sr=1-1

И вам также следует прочитать оновые функции, представленные в MVC3, который теперь находится в RC (есть действительно новый движок представления) http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx

2 голосов
/ 15 ноября 2010

Вы не объявляете бизнес-логику дважды.Просто эта бизнес-логика абстрагируется от интерфейса, и в реализации этого интерфейса вы можете делать все, что захотите: обращаться к базе данных, читать из файловой системы, собирать информацию с веб-адресов, ... Этот интерфейс позволяет слабую связь междуКонтроллер и реализация хранилища и среди прочего упрощает TDD.Думайте об этом как о договоре между контролером и бизнесом.

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