Шаблоны проектирования уровня доступа к данным - PullRequest
13 голосов
/ 29 июня 2009

Мне нужно спроектировать слой доступа к данным с .NET, который, вероятно, будет использовать более одной системы управления базами данных (Mysql и Sql Server) с одинаковым реляционным дизайном.

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

Спасибо.

Ответы [ 7 ]

12 голосов
/ 29 июня 2009

Я рекомендую шаблоны корпоративной архитектуры приложений от Мартина Фаулера.

Список шаблонов также есть на его сайте

Шаблон DataMapper также актуален.

8 голосов
/ 29 июня 2009

Мне нравится использовать интерфейсный доступ к базе данных. Каждый поставщик БД для Ado.net реализует базовые интерфейсы, и при их использовании ваш код может выглядеть следующим образом:

public static IDbConnection GetConnection(string connectionName)
{
  ConnectionStringSettings ConnectString = ConfigurationManager.ConnectionStrings[connectionName];
  DbProviderFactory Factory = DbProviderFactories.GetFactory(ConnectString.ProviderName);
  IDbConnection Connection = Factory.CreateConnection();
  Connection.ConnectionString = ConnectString.ConnectionString;
  return Connection;
}

Тогда, когда вам нужно общаться с БД:

public static DataTable Dummy()
{
  using (IDbConnection Connection = GetConnection("SiteSqlServer"))
  {
    IDbCommand Command = Connection.CreateCommand();
    Command.CommandText = "DummyCommand";
    Command.CommandType = CommandType.StoredProcedure;

    Connection.Open();

    using (IDataReader reader = Command.ExecuteReader())
    {
      DataTable Result = new DataTable();
      Result.Load(reader);
      return Result;
    }
  }
}

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

2 голосов
/ 29 июня 2009

В общем, я повторяю рекомендацию Джона Нолана о шаблонах архитектуры корпоративных приложений .

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

Вы можете использовать контейнер для инъекций зависимости или сделать это вручную .

С технологической точки зрения я бы порекомендовал Microsoft Entity Framework , поскольку ваши потребности в доступе к данным ограничены реляционными базами данных. Entity Framework является официальным OR / M от Microsoft и имеет поставщиков для множества различных РСУБД, а также поддержку LINQ.

2 голосов
/ 29 июня 2009

Самое простое решение - использовать ORM. Проверьте LLBLGen. Используя модель адаптера, вы можете переключаться между поставщиками данных, используя одни и те же бизнес-объекты. Он может генерировать код для MySql и Sql Server.

1 голос
/ 29 июня 2009

Это действительно зависит от размера вашего слоя и типа продукта, который вы разрабатываете. Если он достаточно хорошо содержится, то ADO.NET, вероятно, будет идеальным. Если это слой DAL большего размера и его разработка с многоцелевым назначением баз данных, лучше всего использовать инструмент ORM. Это быстрые, эффективные и зрелые продукты, которые могут быстро включить ретаргетинг на другую базу данных, просто изменив один параметр. Написание статического ADO, это то, что переходит в наследство.

Существует несколько инструментов ORM, которые могут выполнять свою работу, все работают по-разному и зависят на ваш бюджет, размер вашей команды и т. д. Они могут либо работать, создавая класс сопоставления, например, NHibernate, либо работать через рефлексию, т.е. разметку атрибутов.

Бесплатно, т. Е. С открытым исходным кодом, если вы любезны, NHibernate идеален. Я использую это в данный момент, чтобы построить слой DAL для продукта большой компании. Это отлично, но потребуется время, чтобы освоить. С помощью NHibernate вы определяете классы отображения, которые при выполнении генерируют модель БД для вас. Он поддерживает хранимые процедуры. Недостатком является то, что для обучения требуется некоторое время, особенно для правильного отображения сложных данных. Это отлично. У него огромный набор примеров и других проектов, которые используют его. Проверьте Koders.com.

Если у вас есть какой-то бюджет, то LLBLGen идеален. Он строго типизирован и также поддерживает хранимые процедуры.

Если у вас уже есть модель данных, то TierDeveloper идеален. Это по существу бесплатно, и работает, разрабатывая набор классов из вашей модели базы данных. Единственный недостаток - картограф для mysql - сторонний. Это продукт класса enteprise, который был сделан бесплатным для поддержки ncache, и его возможный подход.

Если вы отчаянно хотите придерживаться MS, они переходят на ORM и имеют продукт ADO.NET Entity Framework. Функционально это не так полно, как инструменты, определенные выше. Около 3 поколений отстают в зрелости. Его доступно в версии 2008 года SP1. Разъем для MySQL будет стоить.

Кроме того, вы можете использовать LINQ. Он также будет нацелен на mysql, если вам также понадобится соединитель.

В идеале, ваша лучшая ставка на ORM. Если вы не можете поддерживать открытый исходный код и иметь бюджет, тогда получите

Надеюсь, это поможет.

0 голосов
/ 29 июня 2009

NHibernate предназначен для такого сценария, если вы хотите его изучить

0 голосов
/ 29 июня 2009

Я нашел ADO.NET , чтобы быть очень полезным для этого. Он имеет все функции, необходимые для создания слоя доступа к данным независимо от используемой базы данных.

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