階層化を実装するためのクリーンな方法を見つけるのに苦労しています。
これが私が持っているレイヤーです(下位レイヤーは、継承または合成のいずれかによって上位レイヤーをサポートします):
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
}
}
これに答えるのに少し時間を割いていただきありがとうございます。