Разработка словаря статического провайдера - PullRequest
0 голосов
/ 22 февраля 2012

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

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

1 Ответ

3 голосов
/ 22 февраля 2012

Почему вы не можете использовать оба?Передайте свою зависимость в метод 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);
}
...