1

階層化を実装するためのクリーンな方法を見つけるのに苦労しています。

これが私が持っているレイヤーです(下位レイヤーは、継承または合成のいずれかによって上位レイヤーをサポートします):

Business Logic Layer (BLL)
Datastore Layer (DSL)
Database Layer (DBL), Web-Service Buffer (WSB)

BLL オブジェクトが get 要求 getRecords() を作成すると、DSL にそれを満たすように要求します。

次に、DSL は、ローカル DBL を使用するか、WSB (「マスター」DB へのリモート Web サービス フロント エンドと通信する) を使用するかを天気で決定します。


オプション 1 - 構成 (BLL には DSL があり、DSL には DBL があります)


私の問題は、DSL および DBL オブジェクトが BLL 内で構成されているため、含まれている BLL について何も知らないため、BLL フィールドを含む特定の DB クエリをどのように作成する必要があるかということです。


オプション 2 - 継承 (BLL : DSL、DSL : DBL)


下位層がパブリック/保護された継承を通じて BLL にアクセスできるようになったとしても、生成する特定のクエリ文字列を DSL と DBL が正確に知る方法については、依然として疑問が残ります。BLL は一連の静的文字列を保持できると思いますが、それによって双方向の依存関係が作成されます。これは、恐ろしい結果をもたらす本当に欠陥のある設計であると思います。

注:各 BLL には、シリアル化先/逆シリアル化元の対応するテーブルがあります。

注:私はリフレクションを使用したくありません。また、ジェネリックの使用を制限したいと考えています (他に方法がまったくない場合を除きます。私の主な関心事はDSL および DBL レイヤー内の BLL 固有のクエリ文字列)。

注: 1 つだけではなく、DSL および DBL レイヤーを使用するさまざまな BLL オブジェクトが多数存在することになります (そうでない場合、これは些細なことです)。

public class BL1 
{
  private DSL _dsLayer;

  public getRecords() 
  {
    // ...
    _dsLayer.getRecords();
    // ...
  }
}

public class DSL 
{
  private DBL _dbLayer;
  private WSB _wsBuffer;

  public getRecords() 
  {
    if(_dbLayer.getRecords() != null)
    {
      return records;
    }
    else
    {
      return _wsBuffer.getRecords();
    }
  }
}

public class DBL
{
  private string _db = "file.db3";

  public getRecords()
  {
    select ????? - how to know what fields to grab
  }
}

これに答えるのに少し時間を割いていただきありがとうございます。

4

3 に答える 3

2

コンポジションを使用する必要があります。これらは完全に異なるタイプのエンティティであり、実際には一方が他方から継承できないため、継承は意味がないと思います。どのフィールドを継承しますか? そして、誰が誰から継承しますか?

BLL は、DSL に到達するために「フィールド」のリストを渡す必要があります。DSL メソッドへのパラメーターとして、またはその他の方法で。DSL メソッドは、フィールドのリストをパラメータとして受け取り、それらを操作します。実現可能な解決策だと思います。

また、型自体を使用する代わりに、各レイヤーでインターフェイスを作成し、それらに対してプログラミングする必要があります。たとえば、あなたが書いたサンプルコードでは、DBL と WSB を IDBL と IWSB に変更します。これにより、テストが改善され、コード内の疎結合が可能になります。

public class DSL 
{
  private IDBL _dbLayer;
  private IWSB _wsBuffer;
....

}
于 2012-07-17T15:11:42.353 に答える
1

一般に、「Is-A」関係がある場合は継承を使用する必要があります。BLL 'Is-A' DSL や DSL 'Is-A' DBL とは言えないため、継承よりも構成を検討します。これには、各依存関係をスタブまたはモックできるため、各論理レイヤーのテストが容易になるという副作用があります。

通常、公開された API では、サーバー側 (つまり、BLL の DSL -> DSL) は、その作業を行うためにオブジェクトを公開する必要があります。DSL が BLL オブジェクトについて認識してはならないという指摘は正しいです。したがって、課題は、データのクエリのために BLL に公開される DSL 用のクリーンな API を作成することです。

DDDのRepositoryパターンとSpecificationパターンの両方を参照することをお勧めします。これらは、あなたが提起している問題のいくつかを解決するのに役立ちます.

于 2012-07-17T15:14:50.070 に答える
1

構成。dtryonとdesigeekが言ったことすべて と、あなたの場合、継承が不自然に見えるため、すべての レイヤーが緊密に結合され、ソースコードへの修正の作成がほとんど制限されなくなります。

継承よりも構成を優先するSO-topicをご覧になると役立つと思います。

于 2012-07-17T15:47:38.537 に答える