4

ビジネスオブジェクトを実装するためのより好ましい方法はどれですか (そしてその理由)?

個別の「コンテキスト」なしで

class Product
{
   public string Code { get; set; }

   public void Save()
   {
       using (IDataService service = IoC.GetInstance<IDataService>())
       {
           service.Save(this);
       }
   }
}

使用法は次のようになります。

Product p = new Product();
p.Code = "A1";
p.Save();

別の「コンテキスト」で

class Product
{
    private IContext context;

    public Product(IContext context)
    {
        this.context = context;
    }

    public string Code { get; set; }

    public void Save()
    {
        this.context.Save(this);
    }
 }

使用法は次のようになります。

using (IContext context = IoC.GetInstance<IContext>())
{
    Product p = new Product(context);
    p.Code = "A1";
    p.Save();
}

これはすべてBL層で起こっています(使用例を除く)、データベースなどとは関係ありません。IDataServiceは、ビジネスオブジェクトを「どこかに」保存するためのデータ層へのインターフェースです。IContext は基本的に IDataService をラップします。実際のビジネス オブジェクトはより複雑で、より多くのプロパティと相互参照 (Order -> OrderRow <- Product など) があります。

私の意見では、最初のアプローチは (あまりにも) シンプルで、2 番目の選択肢は単一のビジネス オブジェクト インスタンスの外でより多くの制御を提供します....? このようなガイドラインはありますか?

4

1 に答える 1

3

個人的には、オブジェクト自体がそれ自体を保存する方法を認識せず、代わりに別のコンポーネントに依存して保存する 3 番目のバージョンを選択します。これは、オブジェクトをデータベース、json ストリーム、xml ストリームに保存するなど、オブジェクトを保存する方法が複数ある場合に興味深いものになります。このようなオブジェクトは通常、シリアライザーと呼ばれます。

したがって、あなたの場合、私は次のように簡単に行きます:

class Product
{
    public string Code { get; set; }
}

IContext シリアル化のシリアル化は次のようになります。

class ContextSerializer
{
    public void SaveProduct(Product prod)
    {
        using(IContext context = IoC.GetInstance<IContext>())
        {
           context.Save(prod);
        }
     }
}

使用法は次のとおりです。

public void SaveNewProduct(string code)
{
   var prod = new Product() { Code = code };
   var contextSerializer = new ContextSerialzer();
   contextSerializer.SaveProduct(prod);
}

これにより、オブジェクトがコンテキスト (例のフィールド) を保持するのを防ぎ、ビジネス オブジェクトをシンプルに保ちます。また、懸念事項を分離します。

ビジネス オブジェクトに継承がある場合は、訪問者パターンを検討してください。

于 2012-05-13T09:32:23.160 に答える