0

現在使用している現在の WCF サービスを再考しています。さまざまなデータベースへの XML のロードを多数行っています。XML データとして格納できる場合もあれば、行セットとして格納する必要がある場合もあります。

そのため、このサービスを再設計して、さまざまなプロバイダーを受け入れるようにしています。私の最初の考えは、古典的な抽象工場でしたが、今は疑問に思っています。基本的に、サービス クラスには 1 つの操作コントラクト メソッド、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 に答える