Как настроить объект и переопределить эту конфигурацию - PullRequest
0 голосов
/ 03 августа 2011

У меня есть следующие интерфейсы и классы:

public interface ILoggingService { ... }
public class LoggingService {
    public LoggingService(ILoggingRepository loggingRepository) { ... }
    ...
}

public interface ILoggingRepository { ... }
public class DatabaseLoggingRepository {
    public DatabaseLoggingRepository(string ConnectionString) { ... }
    ...
}
public class FileLoggingRepository {
    public FileLoggingRepository(string LogFilePath) { ... }
    ...
}

Я занимаюсь рефакторингом своего программного обеспечения для использования инфраструктуры Unity IoC и ищу способ передачи конкретной конфигурации каждой реализации ILoggingRepository.

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

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

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

То, что мы решили сделать, это создать класс, в вашем случае это будет LoggingConfiguration, и он будет передан в конструкцию хранилища. Если вы решите использовать Unity, он создаст экземпляр этого класса, используя Activator, без необходимости его регистрации. Однако в ваших тестах вы просто добавляете новый экземпляр производного класса конфигурации, предоставляя другие значения.

Имеет ли это смысл? Должен ли я уточнить больше?

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

Я бы расширил конструктор ILoggingRepository, чтобы он выглядел так:

   public ILoggingRepository(ILoggingConfigurationProvider confProvider);

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

public LoggingConfigurationProvider : ILoggingConfigurationProvider {
 public LoggingConfigurationProvider() {
   // load both values from configuration file
 }

 public string LogPath { get; set; }
 public string ConnectionString { get; set; }
}

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

1) Создать новую реализацию "Mock"

public class MockLoggingConfigurationProvider : ILoggingConfigurationProvider  {
   public MockLoggingConfigurationProvider() {
      // set both values to a test value
   }

   public string LogPath { get; set; }
   public string ConnectionString { get; set; }
}

Теперь вы можете создать репозиторий, используя конструктор:

new LoggingRepository(new MockLoggingConfigurationProvider());

или если вы хотите использовать весь механизм IoC, вы просто (при настройке контейнера) регистрируете эту реализацию интерфейса. Поскольку модульные тесты являются отдельными, вы не разделяете регистрации правильно? Так что это должно дать вам то, что вам нужно, возможность изменять эти настройки в зависимости от того, выполняются они в качестве модульного теста или нет.

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

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

0 голосов
/ 03 августа 2011

Поскольку проектное предложение не заставляет IoC иметь дело с конфигурацией . Каждый регистратор должен управлять конфигурацией так, как они предпочитают в своей реализации. IoC должен просто ввести логгер. Для модульного / интеграционного теста в обоих случаях вы должны иметь возможность предоставить конфигурацию для регистратора, например, используя log4net. Я привык настраивать подсистему журналирования при запуске теста через API, и я создаю appender что пишите просто вечно на консоли. Вы не можете Insolate конфигурации с помощью IoC, так как каждая возможная система ведения журналов не обязана совместно использовать контракт для части конфигурации.

...