Внедрение зависимостей на основе конфигурации?


Я работаю над приложением, которое использует active directory для извлечения пользователей. Иногда мне нужно работать над приложением, но объявление недоступно. Я использовать класс-оболочку для извлечения пользовательских объявлений. Я хотел бы ввести другой класс, основанный на конфигурации. Я думал об использовании appSetting, который сообщит мне текущую конфигурацию и решит, какой тип использовать при инъекции. Можно ли получить текущую конфигурацию без использования Интернета?трансформация конфигурации? Можно ли вводить объекты с помощью Единство, основанное на сети.преобразования конфигурации? Можете ли вы порекомендовать лучший подход?

[Обновление]

У меня есть пользовательский класс репозитория, который загружает пользователей из AD. Все, что мне нужно, это иметь возможность изменить реализацию этого класса репозитория, чтобы, когда AD недоступен, я мог загружать пользователей другим способом. Это будет использоваться только для разработки, производство всегда будет обращаться к AD и получать пользователей.

3 2

3 ответа:

Можно использовать директивы препроцессора:

#if DEBUG
// register fake repository
#else
// register AD repository
#endif

Ну, инъекция зависимости невероятно мощна, гибка и создает разделение проблем. Ловушка в вашем подходе будет заключаться в валидации. Видите ли, при таком подходе вы должны выбрать конкретную реализацию.

Так как же вы назовете эти два класса?
public class LogToText : ILogger
{
     public void LogMessage(string message) { }
}

public class LogToEvent : ILogger
{
     public void LogMessage(string message) { }
}

У вас есть эти две реализации, но когда вы передаете интерфейс в:

public class AD
{
     public AD(ILogger logger) { }
}

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

Для этого можно использовать абстракцию:

public interface IPersonService
{
    IEnumerable<Person> Find(PersonSearchParameters searchParams);
    Person GetByAccountName(string accountName);
    [ETC...]
}

Тогда и ваша реклама, и разработка реализуют этот интерфейс.

Чтобы сделать все проще, я предлагаю использовать StructureMap IoC, так что вы можете легко сделать это:

x.For<IPersonService>.Use<ActiveDirectoryPersonService>(); //for production

Или

x.For<IPersonService>.Use<MockPersonService>(); //for development

При использовании этого вы можете, например:

public class TestController : Controller
{
    IPersonService _service;

    public TestController(IPersonService service)
    {
        _service = service;
    }
}

Вместо использования XML-файла для настройки в этом случае я предлагаю использовать Fluent code of Structure Map, это лучше при рефакторинге и избежать опечаток, потому что это компилирует.

StructureMap: http://structuremap.net

Простая установка через NuGET