0

私は、ある永続性パターンから別の永続性パターンに移行しようと取り組んでいるプロジェクトに取り組んでいます。

エンタープライズアプリケーションアーキテクチャのパターン、デザインパターン、およびこのMSDNの記事でヘルプを確認しました。現在のパターンは、MSDNの記事で説明されているアクティブレコードパターンです。よりモジュール化されたコードベースに移行するための最初のステップとして、ビジネスオブジェクト(別名テーブル)の一部を複数のインターフェイスに分割しようとしています。

たとえば、次のようなストアアプリケーションがあるとします。

public interface IContactInfo
{
    ...
}

public interface IBillingContactInfo: IContactInfo
{
    ...
}

public interface IShippingContactInfo: IContactInfo
{
    ...

}

public class Customer: IBillingContactInfo, IShippingContactInfo
{
    #region IBillingContactInfo Implementation
    ...
    #endregion

    #region IShippingContactInfo Implementation
    ...
    #endregion

    public void Load(int customerID);
    public void Save();
}

Customerクラスは、Customerテーブルの行を表します。Customerクラスは1行ですが、実際には2つの異なるインターフェイス(IBillingContactInfo、IShippingContactInfo)を実装しています。

これまで、Customerオブジェクト全体をあちこちに渡して、必要な変更を加えて保存しただけの2つのインターフェイスはありませんでした。

ここで問題が発生します。これらの2つのインターフェイスができたので、IContactInfoを取得してユーザーに表示し、ユーザーが間違っている場合に修正できるようにするコントロールを作成できます。現在、IContactInfoインターフェイスは、変更を永続化するためのSave()を実装していません。

他のよく知られたソリューションに完全に切り替えることなく、この制限を回避するための優れたデザインパターンに関する提案はありますか?すべてのインターフェイスにSave()メソッドを追加したくはありませんが、最終的にはそれを実行する必要があるかもしれません。

4

2 に答える 2

1

何種類の派生物IContactInfoを計画していますか?

ContactInfoおそらく私は要点を見逃しているかもしれませんが、それぞれにaBillToShipToインスタンスを使用して呼び出されるクラスを使用した方がよいと思いますCustomerIShippingContactInfo とインターフェイスは同じインターフェイスIBillingContactInfoを継承するため、クラスは1セットのフィールドで両方の基本インターフェイスを満たします。それは問題になるでしょう。IContactInfoCustomerIContactInfo

これらの個別のインスタンスを作成することをお勧めします。そうすれば、あなたの節約Customerははるかに簡単です。

永続化のためのシリアル化またはデータベースなどへの保存を計画していますか?

CustomerとContactInfoに具体的なタイプを使用すると、最初の2つを確実にカバーできます。

(フラットファイルは元のセットアップで機能しますが、それを計画していないことを願っています。)

私はそれがすべてあなたが持っていると期待するIContactInfoの派生物の数に帰着すると思います。グラフの地形がもう少し増えても問題はありません。それが複数の部分を持つ1つのレコードを意味する場合(あなたの例)、またはそれが1対多の関係である場合(私の例)、またはタイプ(ShipTo、BillToなど)をリストする多対多の場合。 )結合テーブル内。多対多は、CustomerとさまざまなContactInfoタイプの間の関係を確実に減らしますが、具体的な関係が必要な場合のシナリオでは、アプリケーション開発のオーバーヘッドが発生します。

于 2012-10-22T21:58:33.670 に答える
0

メソッドを強制するインターフェースを実装するSave()だけで、継承されたインターフェースにメソッド制約を簡単に追加できます。したがって、も持っているものはすべて、したがって持っている必要があります。これは、and-または、より意味的な正確さ、およびを使用して行うこともできます。IContactInfoIPersistableSave()IContactInfoIPersistableSave()ILoadableLoad(int ID)IRetrievableRetrieve(int ID)

ContactInfoただし、これはオブジェクトの使用方法に完全に依存します。これがあなたの使用法に関して意味をなさないならば、コメントを残すか、あなたの質問を更新してください、そして、私は私の答えを再訪します。

于 2012-10-22T21:58:09.017 に答える