這個問題可能更適合程序員堆棧。如果是這樣,我會移動它。不過,我想我可能在這裏得到更多答案。在域類中使用服務定位器模式有時可以嗎?
到目前爲止,我的域中的所有接口依賴項都是使用執行程序集中的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