環境(web / windows)に基づいたクラスのデータの抽象ストレージ
質問
クラスがあり、その情報の保存は、WebアプリケーションまたはWindowsアプリケーションのどちらで使用されるかによって異なります。ファクトリオブジェクトを使用して、正しいオブジェクトを渡します。オブジェクトを再作成したくない場合、呼び出し元はそのオブジェクトを適切に保存すると思います。プラットフォームに基づいてデータのストレージを抽象化する他の提案はありますか?
たとえば、Windowsアプリ(適切なサブクラスを送信)によって呼び出されると、ローカル変数としてデータを保存し、Webアプリによって呼び出されると、セッションに保存します。
解決
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);
他のヒント
Factoryパターンは、あなたが抱えている問題の解決策であるかのように聞こえません。 Factoryパターンは、クラスの特定のサブタイプのインスタンスを提供し、(a)返される実際のサブタイプ、および(b)返されるサブタイプを決定するためにファクトリが使用したロジックからファクトリの呼び出し元を保護することを目的としています。
これはここで必要なものではありません。格納されるデータをモデル化するクラスからデータの格納を抽象化する必要があると思います。
2つのアプリケーションに共通のクラスがあり、それらの各アプリケーションは、そのアプリケーションに適した方法でクラスによってカプセル化されたデータを保存する機能を実装する必要があります。これは2つのことを意味します:
-
各アプリケーション(WebおよびWindowsフォーム)には、データを格納する機能が含まれている必要がありますが、他のアプリケーションが使用するコードを含める必要はありません。例えばWindowsフォームアプリは、Webセッションにデータを保存する方法を知る必要はありません。そのため、Webセッションにデータを保存するコードは、Webアプリの一部であるが、Windowsフォームアプリの一部ではないオブジェクトに存在する必要があり、その逆も同様です。
-
これが事実であり、保存するデータのクラスが両方のアプリに共通でなければならないことを考えると、そのストレージロジックをそのクラスの一部にすることはできません。 (受け入れられたオブジェクト指向の設計原則に従って、そのクラスはアプリケーションのさまざまな部分に自分自身を格納する方法を知らないはずです。将来の変更を困難にする依存関係が導入されるためです。単一の責任の原則 ...)
これが役立つことを願って