Этот вопрос может быть более подходящим для стека программистов. Если так, я перенесу это. Однако я думаю, что я могу получить больше ответов здесь.
Пока что все зависимости интерфейса в моем домене разрешаются с помощью DI из исполняемой сборки, которая на данный момент является проектом .NET MVC3 (+ контейнер Unity IoC). Однако я столкнулся со сценарием, где я думаю, что сервисный локатор может быть лучшим выбором.
В домене есть объект, который хранит (кэширует) контент из URL. В частности, он хранит XML SAML2 EntityDescriptor из URL-адреса метаданных. У меня есть интерфейс IConsumeHttp с одним методом:
public interface IConsumeHttp
{
string Get(string url);
}
Текущая реализация использует статический класс WebRequest в System.Net:
.
public class WebRequestHttpConsumer : IConsumeHttp
{
public string Get(string url)
{
string content = null;
var request = WebRequest.Create(url);
var response = request.GetResponse();
var stream = response.GetResponseStream();
if (stream != null)
{
var reader = new StreamReader(stream);
content = reader.ReadToEnd();
reader.Close();
stream.Close();
}
response.Close();
return content;
}
}
Сущность, которая кэширует содержимое XML, существует как некорневая в гораздо большем совокупности сущностей. Для остальной части совокупности я реализую довольно большой шаблон Facade, который является публичной конечной точкой для контроллеров MVC. Я мог бы добавить зависимость IConsumeHttp в конструктор фасада следующим образом:
public AnAggregateFacade(IDataContext dataContext, IConsumeHttp httpClient)
{
...
Проблема, с которой я сталкиваюсь, заключается в том, что только один метод на фасаде имеет зависимость от этого интерфейса, поэтому глупо внедрять его для всего фасада. Создание объекта класса WebRequestHttpConsumer
не должно добавлять много накладных расходов, но домен не знает об этом.
Вместо этого я рассматриваю возможность перемещения всей логики кэширования для сущности в отдельный статический фабричный класс. Тем не менее, код будет зависеть от IConsumeHttp
. Поэтому я думаю об использовании статического локатора службы в методе статической фабрики для разрешения IConsumeHttp, но только тогда, когда необходимо инициализировать или обновить кэшированный XML.
Мой вопрос: это плохая идея? Мне кажется, что ответственность за обеспечение надлежащего кэширования метаданных XML должна лежать на домене. Домен делает это периодически как часть других связанных операций (таких как получение метаданных для запросов и ответов SAML Authn, обновление SAML EntityID или URL-адреса метаданных и т. Д.). Или я просто слишком переживаю из-за этого?