2010-11-02 3 views
2

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

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; 
    } 
    } 

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

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

Заранее спасибо.

ответ

3

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

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

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

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

+0

Привет Джеймс, ninject выглядит интересно, единственное, что я все еще изучаю .Net так интересно, будет ли кривая обучения немного крутой. – gdp

+0

У меня есть более пристальный взгляд на ninject, я понимаю концепцию DI и думаю, что я понимаю, как использовать инъекцию setter внутри моих страниц/классов. Однако мне любопытно, где бы я его разворачивал, в настоящее время у меня есть 3 слоя UI, BL, DAL и думал о бизнес-уровне. Это верно? – gdp

+0

geppie - вы можете использовать его во всех слоях. Например, в MVC-приложениях обычно генерировать контроллеры с использованием DI, чтобы вы могли автоматически вводить параметры конструктора - например, ссылку на ваш BL. В вашем репозитории вы можете вводить ссылки на ваш DAL. Подумайте об этом как о способе разбить зависимости внутри слоев, но также и между слоями. Скорее всего, это сложная идея, с которой вы сначала справляетесь - но по мере знакомства с ней вы должны увидеть, что она работает на многих уровнях. После того, как вы начнете думать об модульном тестировании, это станет бесценным. –

0

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

1

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

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

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

... как я могу сделать универсальный завод ...

Я не сделал этого раньше, как вы, я всегда проходил в значении от сети. конфигурации. Трюк решает: где сидит ответственность за определение того, какой класс DAL загружается.

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

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

+0

Привет адриана. Ответственность за загрузку класса DAL в настоящее время входит в мой проект DataAccess, но я обсуждаю, следует ли его помещать в Common. Благодарю. – gdp

0

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

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

0

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

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

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

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