这个问题可能更适合程序员堆栈。如果是这样,我会移动它。不过,我想我可能在这里得到更多答案。在域类中使用服务定位器模式有时可以吗?
到目前为止,我的域中的所有接口依赖项都是使用执行程序集中的DI来解决的,目前它是.NET MVC3项目(+ Unity IoC容器)。不过,我已经运行了一个场景,我认为服务定位器可能是更好的选择。
域中存在一个存储(缓存)来自URL的内容的实体。具体而言,它存储来自元数据URL的SAML2 EntityDescriptor XML。我有一个单一的方法的接口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实体ID或元数据URL等)。或者我只是担心它太多?
相关:http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve-dependencies-for-entities-business-objec – Steven 2012-03-21 15:11:20
IMO这是一个有效的问题所以。 – Steven 2012-03-21 15:11:43
@Steven感谢您的链接,信任投票以及您的博客,了解如何使用您的架构的查询+命令端。非常有趣的东西。 – danludwig 2012-03-21 16:31:30