2016-07-11 5 views
1

У меня есть приложение, которое использует Structuremap для DI как для моего бизнеса, так и для слоя DAL. До этого момента у меня был единственный DAL для среды, над которой я работал. Поэтому я бы взял его из конфигурации и использовал это значение для всех моих подключений. Примером этого является.Injection Dependency для DAL с несколькими строками базы данных с использованием StructureMap

using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ToString())) 
{ 
    //Do a call to db here. 
} 

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

ObjectFactory.GetInstance<IDALManager>().MethodName(); 

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

ОБНОВЛЕННАЯ ИНФОРМАЦИЯ Пользователь определит, какая строка соединения должна использоваться. Например, они будут перемещать данные из dev для тестирования, они будут выбирать источник и пункт назначения.

string source = \\user selection from combobox. 
if (source == "DEV") 
{ 
    //Instantiate dev instance of manager 
} 
if (source == "TEST") 
{ 
    //Instantiate Test Instance of manager. 
} 
+0

Где вы называете это 'ObjectFactory.GetInstance () .MethodName();' from? почему вы хотите сохранить весь доступ к строке соединения в DAL? –

+0

Я вызываю этот метод в бизнес-слое. Я хочу сохранить строку соединения в DAL для разделения внимания. На самом деле это мой первый раз, когда я использую DI, и мне хотелось бы, чтобы некоторые рекомендации касались того, как правильно обрабатывать несколько строк соединения. – Nate

+0

Как вы собираетесь решить, какую строку подключения использовать? Можете ли вы предоставить некоторый псевдокод о том, как такое решение будет? –

ответ

0

Необходимо abstract factory. Взгляните на ответ в this question для некоторых примеров.

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

public interface IDALManagerFactory 
{ 
    IDALManager Create(string environment); 
} 

Вы должны создать реализацию этого интерфейса, который создает «DAL Manager» с соответствующей строкой соединения.

Чтобы быть в состоянии сделать это, вам нужно строку подключения, который будет введен в конструктор вашего класса, как это:

public class MyDalManager: IDALManager 
{ 
    private readonly string connectionString; 

    public MyDalManager(string connectionString) 
    { 
     this.connectionString = connectionString; 
    } 

    public MyMethod() 
    { 
     //.. 

     using (SqlConnection con = new SqlConnection(connectionString)) 
     { 
      //Do a call to db here. 
     } 
    } 
} 

Теперь реализация завода будет выглядеть примерно так:

public class DALManagerFactory : IDALManagerFactory 
{ 
    public IDALManager Create(string environment) 
    { 
     if(environment == "DEV") 
      return new MyDalManager(
       ConfigurationManager.ConnectionStrings["Database"].ToString()); 
     //... 
    } 
} 

Этот заводский класс должен жить в Composition Root. Вы также можете получить доступ к контейнеру внутри этого заводского класса для создания «DAL Manager».

Теперь, класс, которому нужен доступ к соответствующему «DAL Менеджера» должен иметь IDALManagerFactory впрыскивается в его конструктор, и он будет использовать такой завод, чтобы создать IDALManager, вызывая Create метод передачи имени среды.

Обратите внимание: в вашем коде вы получаете доступ к строке подключения в слое DAL. Вы действительно должны получить доступ к такой информации только в корне композиции.