Архитектура для приложения с поддержкой базы данных - PullRequest
7 голосов
/ 21 июня 2011

Я ищу эталонную реализацию шаблона «Единица работы» и «хранилище» для MS SQL Server или простого старого ADO.NET. Но все примеры построены на основе существующего контекста, такого как Linq2SQL или EF. Насколько я понимаю, эти технологии сами практически реализуют эту модель.

Но как мне работать с «простым» SQL-репозиторием без какого-либо контекста и методов SaveChanges ()? Правильный ли способ использования TransactionScope? Например, собрать все операции SQL в список команд, а затем просто выполнить их одну за другой в пределах области Tx ... или это слишком просто?

Почему я ищу это? У меня есть задача создать слой данных, который может работать как с древней базой данных Sybase, так и с SQL Server (может быть, дополнительным в сочетании с компонентом EF4 на основе POCO)

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

Обновление: Я был в отпуске на прошлой неделе. Извините за задержку. Сегодня я построил базовую картину моей архитектуры для этого. [ссылка] (s7.directupload.net/file/d/2570/whb7ulbs_jpg.htm). Моя идея состоит в том, чтобы создать простой ObjectContext, такой как EF ObjectContext, который существует параллельно с EF Context и используется моим репозиторием. Этот контекст собирает транзакции Sql ATOM в виде стека и выполняет их в транзакции в части единицы работы. Отличная идея? Плохая идея? Трудно сделать? Я с нетерпением жду ваших мнений по этому вопросу.

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Если вас беспокоит объем транзакции, позвольте мне указать вам на библиотеку System.Transactions и ее объект TransactionScope . Отличный класс. любая sql или другая система, управляемая транзакциями, которая управляется в том же потоке, который создал экземпляр области транзакции, будет автоматически добавлена ​​в транзакцию. таким образом, если какая-либо часть кода дает сбой и выдает исключение, вы можете просто не вызывать метод scope.Complete (), и все операции в пределах области транзакции откатываются. очень хороший класс.

1 голос
/ 22 июня 2011

Я не завидую твоей задаче; Поддержка нескольких баз данных в вашем приложении будет непростой задачей.

Вот пример шаблона «единица работы» с использованием ASP.NET MVC и LightSpeed: ссылка

Лично я бы использовал EF или NHibernate (предпочитаю EF); SQL Anywhere поддерживает ADO.NET и Entity Framework, поэтому (в идеале) вам не нужно делать ничего особенного для поддержки этой базы данных.

Удачи!

...