2009-03-13 1 views
0

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

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

+0

Я мог бы просто хранить весь объект надлежащим образом и не имеют класс сам об этом знать ... – CSharpAtl

ответ

1

Как говорится в 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); 
+0

Согласовано - конкретный пример того, что я пытался описать. :) – razlebe

+0

очень хороший момент ... это образец, который я использовал все время ... только что получил здесь трек ... СПАСИБО ... – CSharpAtl

0

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

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

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

  1. Каждое приложение (веб и окна формы) должны содержать функциональные возможности сделать это хранить вдали данных - но ни потребности включать код, используемый другим. например приложение windows forms не должно знать, как хранить данные в веб-сеансе. Таким образом, код, хранящий данные в веб-сеансе, должен находиться в объекте, который является частью веб-приложения, но не является частью приложения форм Windows, и наоборот.

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

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

Смежные вопросы