Внедрение зависимостей на основе конфигурации?
Я работаю над приложением, которое использует active directory
для извлечения пользователей. Иногда мне нужно работать над приложением, но объявление недоступно. Я использовать класс-оболочку для извлечения пользовательских объявлений. Я хотел бы ввести другой класс, основанный на конфигурации. Я думал об использовании appSetting, который сообщит мне текущую конфигурацию и решит, какой тип использовать при инъекции. Можно ли получить текущую конфигурацию без использования Интернета?трансформация конфигурации? Можно ли вводить объекты с помощью Единство, основанное на сети.преобразования конфигурации? Можете ли вы порекомендовать лучший подход?
[Обновление]
У меня есть пользовательский класс репозитория, который загружает пользователей из AD. Все, что мне нужно, это иметь возможность изменить реализацию этого класса репозитория, чтобы, когда AD недоступен, я мог загружать пользователей другим способом. Это будет использоваться только для разработки, производство всегда будет обращаться к AD и получать пользователей.
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