2009-11-23 7 views
13

エンティティの設定の詳細を処理する方法に関するグループの考えを得たいだけでした。DDDのアプリレベルの設定は?

私が特に考えているのは、管理者に変更される可能性のある高レベルの設定です。最終的にはappやweb.configに格納することができますが、DDDの観点からは、オブジェクトのどこかに明示的に設定する必要があります。

議論のために、WebベースのCMSまたはブログアプリを例にしましょう。

与えられたブログエントリの実体がなど著者のようなインスタンスの設定の任意の数、コンテンツ、

を持っているしかし、あなたはまた、サイト内のすべてのエントリで始まる必要があります(例えば)デフォルトの説明やキーワードを設定することをお勧めします彼らが著者によって変更されていない場合。確かに、あなたはクラスの定数を作ることができますが、サイトの所有者はデフォルトを変更できませんでした。

次のように私の考えは次のとおりです。

1)これらの設定を表すために、クラスレベル(静的)プロパティを使用して、アプリの起動時にそれらを設定し、いずれかのDBから、またはWebからそれらを設定します.config。

または

2)は、それを直接使用するか、それが最も簡単として、あなたのすべてを打つ何のエントリークラス

のメンバーである必要がありいずれかで、おそらく、辞書を設定を保持するための別のエンティティを使用します/フレキシブル?エンティティのクラスメソッドを変更すると、アプリケーション自体も変更されるため、プラグイン可能(非常に多くの機能を追加したい場合)になることはないということです(OCP違反)。 2番目の方は、より重いように感じます。特に、辞書から値をキャストまたは解析する必要がある場合は特にそうです。

答えて

7

値が設定可能かどうかは、ドメインモデルの観点からは無関係です。重要なのは、外部的に定義されているということです。

名前が必要なクラスがあるとします。名前が常に必要な場合は、値のソースに関係なく、不変式としてカプセル化する必要があります。ここにはC#の例があります:

public class MyClass 
{ 
    private string name; 

    public MyClass(string name) 
    { 
     if(name == null) 
     { 
      throw new ArgumentNullException("name"); 
     } 

     this.name = name; 
    } 

    public string Name 
    { 
     get { return this.name; } 
     set 
     { 
      if(value == null) 
      { 
       throw new ArgumentNullException("name"); 
      } 
      this.name = value; 
     } 
    } 
} 

このようなクラスはインバリアントを効果的に保護します。名前はnullであってはなりません。ドメインモデルは、どのような消費者がそれを使用するかに関わらず、このような不変量をカプセル化する必要があります。そうでなければ、Supple Designの目標を達成できません。

しかし、デフォルト値について尋ねました。 Nameに適切なデフォルト値がある場合、そのデフォルト値をMyClassにどのように伝達しますか?

これは、工場が便利な場所です。それらの実装からオブジェクトの構築を単に分離するだけです。いずれにしても、これは良い考えです。抽象ファクトリまたはビルダーの実装を選択するかどうかは重要ではありませんが、抽象ファクトリは適切なデフォルト選択です。MyClassのの場合

、我々はIMyClassFactoryインタフェースを定義することができます。必ずそのコードを作る

public ConfigurationBasedMyClassFactory : IMyClassFactory 
{ 
    public MyClass Create() 
    { 
     var name = ConfigurationManager.AppSettings["MyName"]; 
     return new MyClass(name); 
    } 
} 

public interface IMyClassFactory 
{ 
    MyClass Create(); 
} 

今、あなたは、configファイルから名前を引っ張る実装を定義することができますそれはMyClassのインスタンスが手動でそれをnew'ingの代わりにそれを作成するためにIMyClassFactoryを使用する必要があります。

+0

デフォルト値は例であり、おそらくは貧弱な値でした。私はFactoryパターンに精通しています。 もう1つの例は、クラスのすべてのインスタンスに適用する必要がありますが、アプリレベルで変更できるものです。おそらく、リストにロードするインスタンスの数(常に)やコメントを表示するかどうかのルールのようなものです。これらは実際にインスタンスレベルの値として私を攻撃しないか、何かを誤解していますか? – Paul

+1

常に1つ以上の関連する値を型にカプセル化し、その型のインスタンスをすべてのコンシューマに注入できます。効率的な理由(またはその他の理由)を理由に、単一の共有インスタンスを注入することを選択できますが、消費者は注入されたオブジェクトの存続期間について知らないことがあります。それはあなたのオプションを開いたままにします。 –