2013-07-01 13 views
6

DDDでユーザー設定の設定にアクセスする方法を教えてください。DDDと設定

私たちはアイテムをキーと値のペアの束として格納する構成データベースを持っています。これは本当にリポジトリパターンに合うようには見えないので、ユーザーがこれらの設定値にアクセスするにはどうすればよいですか?

理想的には、BillingSettings、ReportSettings、TaxSettingsという異なるグループの構成に対して別々のクラスを用意したいと思います。

これらのそれぞれに別個のリポジトリを提供することは奇妙に思えるかもしれませんが、これらの設定クラスの永続性の無知を維持したいと思っています。

DDDの設定へのアクセスを有効にする正しい方法は何ですか?

答えて

1

私が通常行っていることは、インターフェイスを使用した設定を抽象化することです。 IBillingConfigurationIReportConfigurationなどです。これらの実装は、関連するメソッドに渡される(または関連するオブジェクトに注入される)ものです。

そこから得られる価値は、本当に重要ではありません。データベースに値を格納するときにリポジトリを使用すると、IConfigurationPropertyRepositoryのようなものがあることがあります。 ConfiruationPropertyはエンティティ世界で一流の市民のようには感じられませんが、それは仕事を完了させるように見えるので、ややこしいことです。

私はIBillingConfigurationの実装を返します。これは基本的なコレクションから必要なプロパティを取得するか、またはConfigurationPropertyオブジェクトです。私は適用する必要があるプロパティのサブセットを保存/取得するように、各I{Some}Configurationため

関連GetSave方法はConfigurationPropertyRepositoryに実装されるだろう。

0

実際にはBillingSettingsはドメインモデルの集約(またはドメインオブジェクト)ですか?そうでなければ、対応するリポジトリを持つべきではありません。

ほとんどの設定は、jdbc url、passwordなどのインフラストラクチャ固有のものです。あなたはDDDの方法でそれらを扱う必要はありません。設定がデータベースに保存され、実行時にユーザーが変更できるようにするには、ConfigurationServiceサポートCRUD操作が必要な場合があります。しかし、ConfigurationServiceはドメインに属しておらず、この順序付けされたコンテキストを注文しているだけで、インフラストラクチャサービスです。 DDDで開発する必要はありません。

@Kristof Jozsaさんのコメントを更新しました。

この設定は、ドメインの概念をサポートするために使用されます。ドメインの概念は抽象的であり、設定にアクセスする方法は実装の詳細です。

class ExpirationSpecification { 
    private int days 
    //other settings?   

    public ExpirationSpecification(int days) {...} 

    public boolean isSatisfied(Order order) {...} 
} 

public class ExpirationServiceImpl implements ExpirationService { 
    //private int days;//inject using placeholder in spring 
    private ConfigurationService configService;//if settings are stored in database 

    ExpirationSpecification spec() { 
     //return new ExpirationSpecification(days); 
     return new ExpirationSpecification(configService.orderExpirationDays()); 
    } 

    void cancel(Order order) {...} 
} 
+1

問題は、多くのビジネス固有の構成値があることです。たとえば、ビジネス用語「有効期限」とそのためのシステム構成可能な値の例を示します。何日?有効期限のチェックはドメインの一部でなければなりませんが、そのためにそこに設定値を取得する必要があります。 –

+0

私は同意する:)。私はそれをドメインのコンセプトとして扱うことを好みます。あなたの例では、私はドメインサービスによって返されるOrderExpirationSpecificationを持っています。この限定された文脈では、それは抽象である。日をどのように得るかは、インフラの懸念事項です。さらに、管理者は実行時に日を変更する必要がありますが、CRUD操作を別の境界のあるコンテキストに分割する必要があります。 – Hippoom

+0

大丈夫です。私はここでは実装上の問題しか見ていません。春またはJEEプラットフォーム..あなたはこれにどのようにアプローチするかについてのヒント? –