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);
    }
}

这是一个好方法吗?我喜欢缓存提供程序的想法,对我来说似乎更有效......虽然,我有时会忽略显而易见的事情。让我知道你的想法!

4

1 回答 1

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);
}
于 2012-02-22T17:35:28.220 回答