База данных Фабрика дизайна - PullRequest
2 голосов
/ 03 ноября 2010

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

  static private ArticlesProvider _instance = null;
  static public ArticlesProvider Instance
  {
     get
     {
        if (_instance == null)
           _instance = (ArticlesProvider)Activator.CreateInstance(
              Type.GetType(Globals.Settings.Articles.ProviderType));
        return _instance;
     }
  }

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

Вышеуказанное в настоящее время переводит все пространство имен, хранящееся в web.config, в соответствующий класс DAL и немного ограничено, поскольку создает только экземпляры ArticlesProvider.Как я могу создать универсальную фабрику, чтобы я мог передать тип провайдера , например, SqlServer и любой класс , например ArticleDAL , который я хочу создать?

Спасибовперед.

Ответы [ 6 ]

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

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

Вы регистрируете отображения в платформе, от интерфейсов до конкретных типов.Эти сопоставления могут быть в файле web.config или в некотором коде конфигурации при запуске приложения.Фреймворк создаст для вас экземпляры классов - при необходимости добавит дополнительные зависимости.

Таким образом, вы можете запросить экземпляр IArticleDAL, и если IArticleDAL требует экземпляр IDbConnection для доступа к БД, то NInject автоматически создаст его и передаст его конструктору реализации IArticleDAL.

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

1 голос
/ 03 ноября 2010

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

Я думаю, что вы в значительной степени там - в данный момент вы передаете значение, которое в конечном итоге устанавливается в web.config - и поэтому не особенно динамично.

Вместо того, чтобы передавать в целомзначение из web.config, которое вы можете передать только идентификатором класса.

... как я могу создать универсальную фабрику ...

Я не делал этого раньше, как и вы, я всегда передавал значение из web.config.Хитрость заключается в том, чтобы решить: где лежит ответственность за решение, какой класс DAL загружен.

Это не может быть на бизнес-уровне (BL) - потому что BL не должен ничего знать о уровне доступа к данным (DAL).

Я могу попытаться ответить дальше, но было бы легче получить больше информации, особенно информации, которая проливает свет на вопрос: где лежит ответственность за решение, какой класс DAL загружается?

0 голосов
/ 10 ноября 2012

Мне интересно, почему бы не использовать собственное решение Microsoft для такого рода работы? DbProviderFactories класс предоставляет GetFactory метод, который принимает имя провайдера в качестве ввода.

Если у вас есть провайдер в вашем web.config, тогда

var conn = DbProviderFactories.GetFactory("providerName").CreateConnection();

Получив объект подключения, вы можете получить почти все остальное, например DbCommand, DbDataReader и т. Д.

0 голосов
/ 17 июля 2012

Просто покончите со всеми этими сторонними слоями, которые добавляют медленный и ошибочный код, и просто используйте .net Framework, встроенный в шаблон Provider, реализуя ProviderBase, то есть, как это используется MembershipProvider.Фреймворк позаботится обо всем остальном.

Мы должны написать хранимые процедуры для нескольких различных баз данных, и хотя очень сложно написать конкретные DAL для каждой базы данных, это прекрасно работает.

0 голосов
/ 03 ноября 2010

Объект доступа к данным может помочь?(ссылка на Java, но концепция все та же)

0 голосов
/ 03 ноября 2010

Вам необходимо использовать шаблон AbstractFactory.

...