2012-02-22 37 views
0

我正在反思我們現在使用的當前WCF服務。我們做了很多加載XML到各種數據庫。在某些情況下,我們可以將其存儲爲XML數據,而在另一些情況下,我們需要將其存儲爲行集。靜態提供程序字典設計

所以我重新設計這個服務來接受不同的提供者。我的第一個想法,經典的抽象工廠,但現在我有我的懷疑。本質上,服務類有一個操作合約方法Load。但對我來說,每次調用Load時,新的提供者實例似乎都很愚蠢。

目前:

// Obviously incomplete example: 
public class XmlLoaderService : IXmlLoaderService 
{ 
    readonly IXmlLoaderFactory _xmlLoaderFactory; 
    readonly IXmlLoader _xmlLoader; 

    public XmlLoaderService() 
    { 
     _xmlLoader = _xmlLoaderFactory(ProviderConfiguration configuration); 
    } 

    public void Load(Request request) 
    { 
     _xmlLoader.Load(request); 
    } 
} 

我在考慮更改爲:

public class XmlLoaderService : IXmlLoaderService 
{ 
    static readonly IDictionary<int, IXmlLoader> _providerDictionary; 

    static public XmlLoaderService() 
    { 
     _providerDictionary = PopulateDictionaryFromConfig(); 
    } 

    public void Load(Request request) 
    { 
     // Request will always supply an int that identifies the 
     // request type, can be used as key in provider dictionary 

     var xmlLoader = _providerDictionary[request.RequestType]; 
     xmlLoader.Load(request); 
    } 
} 

這是一個好辦法?我喜歡緩存提供商的想法,對我來說似乎更有效率......但是,我有時忽略這種顯而易見的做法。讓我知道你的想法!

回答

3

爲什麼你不能同時使用?將您的依賴關係傳入Load方法,如果該類型已被緩存,請使用緩存實例。

public void Load(Request request) 
{ 
    // Request will always supply an int that identifies the 
    // request type, can be used as key in provider dictionary 

    IXmlLoader xmlLoader; 
    if(_providerDictionary.ContainsKey(request.RequestType)) 
    { 
     xmlLoader = _providerDictionary[request.RequestType]; 
    } 
    else 
    { 
     xmlLoader = //acquire from factory 
     _providerDictionary.Add(request.RequestType, xmlLoader); 
    } 
    xmlLoader.Load(request); 
} 
+0

謝謝,我假設您認爲在這種情況下緩存提供者是一個可行的選擇,所以我會接受爲最好的(儘管是唯一的)答案!謝謝! – Didaxis 2012-02-22 19:08:34