2

サービスレイヤーは、モデルレイヤーの上にあると想定されています。そのため、モデルはサービスを呼び出すことは想定されていません。

しかし、私は次のような状況に直面しています。

interface Component {
    getResult();
}
class Number implements Component {
    private value;
    public getResult() {
        return value;
    }
}
class Addition implements Component {
    private component1;
    private component2;
    public getResult() {
        return component1->getResult() + component2->getResult();
    }
}
class ConstantFromExternalSource implements Component {
    private identifier;
    public getResult() {
        // call a service for fetching constant identified by identifier
    }
}

(擬似コード)

ここで、私のモデルはサービス(Webサービスかどうか)を介して外部データソースにアクセスする必要があります。

この状況で私はどのようにすべきですか?モデル内のサービスを呼び出しても大丈夫ですか?

「getResult」メソッドをモデルから移動して「ComponentService」に入れることを提案した場合、OOPのすべての利点が失われるため、同意しません(ここで、モデルは再帰的に解決する必要のあるツリーを作成します) 、したがって、OOPが最良のソリューションです)。

4

3 に答える 3

1

外部ソースにコンポーネントとして定数を直接返すようにします。クラス(少なくともこの形式では)はサービスを呼び出すだけなので、ConstantFromExtenralSourceクラスをサービスに結合することはありません。インターフェイスとしても結合しません。

ただし、外部ソースがConstrantFromExternalSourceクラスにラップする必要のあるデータを返す場合は、コンストラクターを介してデータをオブジェクトにプッシュするだけです。

簡単に言うと、モデルが外部ソースからデータを取得するための単なる抽象化である場合は、リポジトリを使用して実際にデータを取得し、外部ソースが必要なオブジェクトを直接返さない場合はモデルを返します。

于 2012-11-23T11:22:12.870 に答える
1

モデル内のサービスを呼び出しても大丈夫ですか?

サービスの種類によって異なります。DDDに関する限り、

  • ドメインは、ドメインを消費する基盤となるアプリケーション層サービスについて確実に知る必要はありません。

  • ドメインレイヤーサービスは同じレイヤーの一部であるため、それほど問題にはなりません。

  • 対照的に、インフラストラクチャ層サービスはドメインオブジェクトに注入する必要があり、ドメインとインフラストラクチャ間の緩い結合が必要な場合は、それらのインターフェイスをドメイン層で宣言する必要があります(リポジトリインターフェイス/実装の場合と同じ)。セルゲイはこれをうまく実装しています。

于 2012-11-26T09:57:30.983 に答える
1

これはいくつかの方法で実現できます。まず、次のような別のインターフェースでモデルの依存関係を抽出できます。

interface CustomService {
 getResult();
}

class ExternalService implments CustomService 
{
  getResult() { // access web service }
}

次に、その依存関係をモデルに挿入します。

class ConstantFromExternalSource implements Component {
    private identifier;
    private CustomService service;

    ConstantFromExternalSource(CustomService service)
    {
        this.service = service;
    }


    public getResult() {
        // call a service for fetching constant identified by identifier
        return service.getResult();
    }
}

これを実現する別の方法は、オブザーバーデザインパターンを使用して、より高いレベルの抽象化に何かが必要であることを通知することです。

どちらの方法でも、モデルをサービスレイヤーの具体的な実装から切り離すことができます。

于 2012-11-26T09:08:03.343 に答える