2012-04-07 6 views
4

ビジネスオブジェクトを実装するためのより好ましい方法(およびその理由)はどちらですか?別の "文脈" がなければコンテキストを持つビジネスオブジェクトかどうか

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

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

と使用方法は、次のようになります。別の "コンテキスト"

class Product 
{ 
    private IContext context; 

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

    public string Code { get; set; } 

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

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

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

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

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

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

答えて

3

個人的には、オブジェクト自体が保存する方法を知らず、代わりに別のコンポーネントを保存することに依存する第3のバージョンを選択します。これは、オブジェクトを保存したり、データベースに保存したり、jsonストリームやXMLストリームに保存するなど、複数の方法がある場合に面白くなります。そのようなオブジェクトは通常シリアライザと呼ばれます。

だからあなたの場合には、私はこのような単純なために行くだろうに:

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

Iコンテキストのシリアル化のためのシリアル化は、次のようになります。

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

これは、オブジェクトがコンテキスト(例のフィールド)を保持するのを防ぎ、ビジネスオブジェクトをsi mple。それはまた懸念をはっきりさせます。

ビジネスオブジェクトに継承されている状況になった場合は、Visitor Patternを検討してください。

+0

関連するビジネスオブジェクトでLazyローディングを使用したい場合(Like ProductにはPartsのリストがあります)、これは私が推測するオプションではありませんか?いいえ、コンテキストフィールドに依存して実装された遅延ロードがありません.... – Harza

+0

オブジェクトをさまざまな方法で永続化する計画があるため、これもフラグを立てました。これは非常に良い選択ですが、この遅延ロード。 – Harza

+0

遅延ロードの一般的なアプローチを知らない場合、実際にはユースケースに依存します。 –

関連する問題