这个问题可能更适合程序员堆栈。如果是这样,我会移动它。不过我想我可能会在这里得到更多的答案。
到目前为止,我的域中的所有接口依赖项都是使用来自执行程序集的 DI 解决的,目前该程序集是一个 .NET MVC3 项目(+ Unity IoC 容器)。但是,我遇到了一种情况,我认为服务定位器可能是更好的选择。
域中有一个实体存储(缓存)来自 URL 的内容。具体来说,它存储来自元数据 URL 的 SAML2 EntityDescriptor XML。我有一个带有单一方法的接口 IConsumeHttp:
public interface IConsumeHttp
{
string Get(string url);
}
当前实现使用 System.Net 中的静态 WebRequest 类:
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 等),域会定期执行此操作。还是我只是担心太多?