2012-04-12 4 views
3

サービスクラスとコントローラからビジネスロジックを移動してビジネスクラス内に配置しようとしています。貧血のドメインを避け、データアクセスクラスをドメインクラス内に置かないようにするにはどうすればよいですか?

public interface IFoo{ 
    IBar CreateBar(creationParameters); 
} 
public class FirstFoo : IFoo{ 
    IBar CreateBar(creationParameters){ 
    return new FirstBar(creationParameter.Id); 
    } 
} 
public interface IBar{ 
    void DoSomething(); 
} 
public class FirstBar : IBar{ 
    FirstBar(int id){...} 
    void DoSomething(){ 
    //well... do something 
    } 
} 
public class SecondBar : IBar{ 
    FirstBar(int id){...} 
    void DoSomething(){ 
    //well... do something else 
    } 
} 

のは、私はそれをどのように行うか、またはFirstBar SecondBarを作成する必要があり、それを知っているために、データベースへのアクセスが必要ですSecondFooを作成する必要があると想像してみましょうか? SecondFooのコンストラクタ内にデータソースを挿入しますか?サービスロケータ? IFooからcreateBarを移動しますか?

EDIT:私はファクトリパターンの定義を探していません。createBarメソッドは "changeBar"や "doBusinessWithBar"のようなものです。

答えて

2

のは、私はそれを知っているデータベースにアクセスする必要がありますSecondFooを作成する必要があると想像してみましょうFirstBarまたはSecondBar

を作成する必要がありますSecondFoo判定ロジックのいくつかの種類を必要とするようですFirstBarまたはSecondBarを作成するかどうかを決定します。そのロジックは、ストラテジーインターフェイスで取り除くことができます。このインターフェイスのうち、データベースアクセスの実装は本番環境で使用されます。あなたはコンストラクタを介して戦略を注入することができます。

IBar CreateBar(creationParameters) { 
    if (strategy.ShouldCreateFirst(creationParameters)) { 
    return new FirstBar(creationParameter.Id);  
    } 
    else { 
    return new SecondBar(creationParameter.Id);  
    } 
} 
+0

これはうまくいくようですが、私たちがこのパターンを悪用すると、私たちはanemycドメインモデルになるでしょうか? –

+0

まあ、必ずしもそうではありません。理想的には、戦略は[この例では](http://codecrafter.blogspot.ca/2012/03/some-oo-design.html)の「TaxEligibilityCheck」のようなドメインの一部です。 –

関連する問題