Дизайн словаря статического провайдера

Я переосмысливаю текущую службу 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);
    }
}

Хороший ли это подход? Мне нравится идея кэширования провайдеров, она кажется мне более эффективной... хотя иногда я склонен упускать из виду очевидное. Позвольте мне знать ваши мысли!


person Didaxis    schedule 22.02.2012    source источник


Ответы (1)


Почему нельзя использовать оба? Передайте свою зависимость в метод 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);
}
person BrokenGlass    schedule 22.02.2012
comment
Спасибо, я предполагаю, что вы считаете, что кеширование провайдеров является жизнеспособным вариантом в этом сценарии, поэтому я приму как лучший (хотя и единственный) предоставленный ответ! Спасибо! - person Didaxis; 22.02.2012