0

クラスがあり、その情報のストレージは、Web アプリケーションまたは Windows アプリケーションによって消費されるかどうかによって異なります。ファクトリ パターンを使用して正しいオブジェクトを渡すつもりでした。オブジェクトを再作成したくない場合は、呼び出し元がそのオブジェクトを適切に保存すると思います。プラットフォームに基づいてデータのストレージを抽象化することについて、他に提案がある人はいますか?

たとえば、Windows アプリによって呼び出されたときにデータをローカル変数として保存し (適切なサブクラスを送信)、Web アプリによって呼び出されたときにセッションに保存します。

4

2 に答える 2

1

sgreeve が言うように、関心の分離は、保守可能なコードを得るために考慮すべきことです。

リポジトリのアイデアを使用して、Winform アプリと Web アプリは独自のストレージ プロバイダーを挿入できます。これらのプロバイダーは、継承または構成によって必要に応じて、いくつかの共通ロジックを共有できます。

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);

および Web アプリ:

var provider = new WebStorageProvider();
var rep = new MyClassRepository(provider);
rep.Save(myClassObject);
于 2009-03-13T21:54:15.983 に答える
0

Factory パターンが問題の解決策であるかのようには思えません。Factory パターンは、クラスの特定のサブタイプのインスタンスを提供することを目的としており、(a) 返される実際のサブタイプと、(b) ファクトリが返すサブタイプを決定するために使用したロジックから、ファクトリの呼び出し元を保護します。

これはここで必要なものではありません。保存されているデータをモデル化するクラスからデータの保存を抽象化する必要があると思います。

2 つのアプリケーションに共通のクラスがあり、これらの各アプリケーションは、クラスによってカプセル化されたデータをそのアプリケーションに適した方法で格納するための機能を実装する必要があります。これは、次の 2 つのことを意味します。

  1. 各アプリケーション (Web および Windows フォーム) には、データを保存するための機能が含まれている必要がありますが、他のアプリケーションが使用するコードを含める必要はありません。たとえば、Windows フォーム アプリは、Web セッションでデータを保存する方法を知る必要はありません。したがって、Web セッションにデータを格納するコードは、Web アプリの一部であるが Windows フォーム アプリの一部ではないオブジェクトにある必要があり、その逆も同様です。

  2. これが事実であり、保存しているデータのクラスが両方のアプリで共通でなければならないことを考えると、そのストレージ ロジックをそのクラスの一部にすることはできません。(受け入れられている OO 設計原則に従って、そのクラスはアプリケーションのさまざまな部分に自分自身を格納する方法を知っているべきではありません。これは、将来の変更を困難にする依存関係を導入するためです。単一責任の原則を参照してください...)

これが役立つことを願っています

于 2009-03-13T21:22:14.203 に答える