2017-02-02 15 views
0

У меня есть следующий заводской метод, который просто возвращает правильную реализацию базы данных. Я хотел бы реорганизовать это на свой контейнер SimpleInjector, но не знаю, как это сделать.Как реорганизовать этот метод фабрики?

public class DALFactory 
    { 
     public static IDatabase GetDAL() 
     { 
      string asm = "SQL"; /* Hardcoded choice of DAL */ 
      if (asm == "XML") 
       return new XmlDatabase(); 
      if (asm == "SQL") 
       return new SqlDatabase(); 
      return null; 
     } 
    } 

Я пытался понять, как я могу зарегистрировать коллекцию, но как я должен сказать SimpleInjector какой использовать при запросе экземпляра IDatabase в моей программе? Открыта для любых идей. Просто теоретическая программа, которую я пытаюсь реорганизовать для практики. Используя DI (IoC) в первый раз, это был такой приятный, открывающий глаза опыт до сих пор!

Я пробовал это сделать, я закрыл?

Container.RegisterCollection<IDatabase>(new [] { typeof(SqlDatabase), typeof(XmlDatabase)}); 
Container.Register<IDatabase, XmlDatabase>(Lifestyle.Singleton); 
Container.Register<IDatabase, SqlDatabase>(Lifestyle.Singleton); 

ответ

1

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

Это означает, что вы должны зарегистрироваться в качестве таковых:

string asm = "SQL"; /* Hardcoded choice of DAL */ 
if (asm == "XML") 
    container.Register<IDatabase, XmlDatabase>(); 
if (asm == "SQL") 
    container.Register<IDatabase, SqlDatabase>(); 
+0

К сожалению, я такой новичок. Я регистрирую кучу вещей в своем классе контейнеров, но забыл признать, что на самом деле я являюсь классом C# и не ограничиваюсь только моими методами контейнеров-библиотек, я могу просто поставить свою собственную логику. Ответ такой простой, я чувствую себя таким немым сейчас. Спасибо!!! – Amivit

+0

Если бы я хотел сделать его более проверяемым, вместо этого уродливого жесткого кодирования, какое альтернативное решение вы могли бы порекомендовать? Таким образом, база данных также может быть макетной. Просто добавьте третий вариант в мой hardcoded if loop или есть лучший подход? – Amivit

+0

@Amivit. Это касается модульного тестирования, ответ совершенно другой. Для модульного тестирования вы вообще не используете Container ** **. Вы создаете класс для проверки вручную. – Steven