Абстрактное хранение данных для класса на основе среды (web / windows)

StackOverflow https://stackoverflow.com/questions/643987

  •  22-07-2019
  •  | 
  •  

Вопрос

У меня есть класс, и хранение его информации будет зависеть от того, будет ли он использоваться веб-приложением или приложением Windows. Я собирался использовать фабричный образец, чтобы раздать правильный объект. Я предполагаю, что вызывающая сторона сохранит этот объект соответствующим образом, если я не захочу воссоздать объект. У кого-нибудь есть другие предложения по абстрагированию хранилища данных на основе платформы?

Например, я хочу сохранить данные как локальные переменные при вызове приложением Windows (отправка соответствующего подкласса) и сохранить в сеансе при вызове веб-приложением.

Это было полезно?

Решение

Как говорит sgreeve, разделение интересов - это то, что необходимо учитывать для получения поддерживаемого кода.

Используя идею хранилища, приложение Winform и веб-приложение могут внедрить свой собственный поставщик хранилища. Эти поставщики могут использовать общую логику, если это необходимо по наследству или составу.

public class MyClassRepository
{
    IStorageProvider _provider;
    public MyClassRepository(IStorageProvider provider)
    {
        _provider = provider;
    }

    public void Save(MyClass o)
    {
        _provider.Save(o);
    }

    public MyClass GetBy(string id)
    {
        return _provider.GetBy(id);
    }
}

Приложение Winforms будет вызывать хранилище через:

var provider = new WindowsStorageProvider();
var rep = new MyClassRepository(provider);
rep.Save(myClassObject);

и веб-приложение:

var provider = new WebStorageProvider();
var rep = new MyClassRepository(provider);
rep.Save(myClassObject);

Другие советы

Мне не кажется, что шаблон Factory - это решение вашей проблемы. Шаблон Factory предназначен для предоставления экземпляра определенного подтипа класса, защищая вызывающего фабрику от (а) фактического возвращаемого подтипа и (b) логики, которую фабрика использовала, чтобы решить, какой подтип возвращать.

Это не то, что вам нужно здесь. Я думаю, что вам нужно абстрагировать хранение данных от класса, который моделирует хранимые данные.

У вас есть класс, общий для двух приложений, и каждое из этих приложений должно реализовывать функциональные возможности для хранения данных, инкапсулированных вашим классом, способом, соответствующим этому приложению. Это подразумевает две вещи:

<Ол>
  • Каждое приложение (веб-форма и форма Windows) должно содержать функциональные возможности для хранения данных, но ни одно из них не должно включать код, используемый другим. например приложению Windows Forms не нужно знать, как хранить данные в веб-сеансе. Таким образом, код, который хранит данные в веб-сеансе, должен быть в объекте, который является частью веб-приложения, но не частью приложения Windows Forms, и наоборот.

  • Учитывая, что это так, и учитывая, что класс, данные которого вы храните, должен быть общим для обоих приложений, эта логика хранения не может быть частью этого класса. (Следуя принятым принципам проектирования ОО, этот класс не должен знать, как хранить себя в разных частях вашего приложения, так как это вводит зависимости, которые усложняют будущие изменения. См. Принцип единой ответственности ...)

  • Надеюсь, это полезно

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top