私のアプリケーションにはIDataItemを実装するタイプのセットがあります。それらはすべてデータベース行を表す単純な「DTO」型です。インスタンスは、データベースに対してSQL selectクエリを実行することによってPetaPoco(マイクロORM)を使用して作成されます。 SQLのselectクエリは型に固有であり、アプリケーションのバージョン番号にも依存します(X型にはYというプロパティがありますが、アプリケーションのバージョンNより前にはDBには対応する列がありません - この場合、 Yについて)。IDataItemを実装する各タイプには関連する文字列(SQL select qry)が必要ですが、インスタンス化する前にアクセスする必要があります
アプリケーションの性質上、これらのタイプが多く、将来的にはその数が増加するということです。私はデータアクセス層でジェネリックスを使用してコードの量を最小限に抑え、(ii)タイプを設計する際に将来の開発者に必要なSQLクエリを設計させようとしています。
- は型パラメータTを持っています:IDataItem
- はT のIEnumerableをを返し
- は、関連付けられたSQL SELECTクエリを見つける方法が何であるかを私はしたいデータアクセス層でそう
、 T
- PetaPocoを使用してDBに対してクエリを実行し、T のリストを作成します(それより少し複雑です - 動的なwhere句もありますが、単純なままにしておきます)
私の挑戦は、Tのインスタンスが作成される前に型パラメータTのSQLクエリを取得する方法です。理想的にはIDataItemにメソッドを追加します。 string SqlSelectFrom(int appVersion)しかし、それを呼び出すためにインスタンスが必要です(インターフェイスに静的メンバーが必要な場合のみ!)。私が今持っている最高のは、このようなデータアクセス層の内部関数である(しかし、これは実際にSQLクエリを実行するために、将来のタイプの開発者を強制的に私の要件を満たしていない):
private string GetSqlSelectFrom<T>(int appVersion) where T : IDataItem
{
if (typeof(T) == typeof(ProductDto))
return "select ProductId, ProductCode from Product";
if (typeof(T) == typeof(ColourDto))
return "select ColourId, ColourCode from Colour";
etc
throw new Exception("No SQL defined!");
}
が良くありますこれを達成するためのパターン?
は、私は2つの方法を考えることができます。 は、(1)(2)アプリのバージョンと異なる場合がありクエリとして機能しない属性 –
DTOタイプのレジストリの種類を使用してDTOクラス 上の属性を使用して。レジストリplzの詳細を説明しますか? – Laurence