Я работаю над большим унаследованным приложением C #, и передо мной поставлена задача удалить все случаи использования статического фабричного класса ServiceLocator.GetObject<T>()
и заменить его инжектированными в конструктор зависимостями.
По большей части это просто, однако в базе кода приложения имеется около 50 случаев, где это немного сложно. Например, Servicelocator
используется в статическом классе, или в методе расширения, или даже в WPF MarkupExtension !.
Например, если бы вы столкнулись с таким фрагментом кода, что бы вы сделали? (кроме плача)
public static class MyExtensions
{
private static ISingletonServiceOne _ServiceOne = null;
private static ISingletonServiceTwo _ServiceTwo = null; // etc ...
public static SummaryHeader GetBannerSummary(this IModel rfq, object requester)
{
Guard.ArgumentNotNull(rfq, "rfq");
Guard.ArgumentNotNull(requester, "requester");
if (_ServiceOne == null)
{
_ServiceOne = ServiceLocator.GetService<ISingletonServiceOne>(requester);
Guard.ArgumentNotNull(_ServiceOne, "_ServiceOne");
}
return _ServiceOne.GetBannerSummary(rfq);
}
В приведенном выше метод ServiceLocator.GetObject () использовался в методе расширения в IModel для определения местоположения зарегистрированной службы-одиночки и выполнения метода с использованием IModel.
Вопрос:
- Существуют ли какие-либо шаблоны / методы, позволяющие избежать такого рода вещей - контейнер DI, необходимый для статического класса, преобразователя значений или метода расширения
- Существуют ли какие-либо шаблоны / методы для работы с циклическими зависимостями в DI?
- Что бы вы сделали в приведенном выше, если есть компромисс между хорошим кодом и временем доставки?
Я думаю переместить метод GetBannerSummary () из расширений и только IModel в этом случае, однако (не смейтесь), есть также случаи, когда тот же ServiceLocator используется в ValueConverters (WPF) и MarkupExtensions: 0
Ваши комментарии / предложения приветствуются