6

PER-FILE /プロジェクト項目ごとにコンパイラ定数を定義することはできますか?PER-FILEベースのC#コンパイラ定数?

背景: すべての読み書きタスクを分離し、両方を実行できるDALを保持していますが、同じメソッドを複数回実装する必要はありません。サポートされているデータベースタイプごとに1インスタンスクラスになります)。

だから私はこのように私のDALを分けたい:C#は多重継承をサポートしていないため、動作しないこと、残念ながら

abstract class ReadDAL 
abstract class WriteDAL 
abstract class ReadWriteDAL (multiple-inheritance from Read&Write-DAL). 

だから、この問題を回避する一つの方法は、インタフェースを定義することによって、次のようになります。

abstract class ReadDAL : IReadDAL 
abstract class WriteDAL : IWriteDAL 
abstract class ReadWriteDAL : IReadDAL, IWriteDAL 

私はこれを行う場合は、私はインターフェイス定義私はDALSの一つに方法を変更するたびに変更する必要がありますReadWriteDALで定義されているメソッドを変更すると、メソッド実装のどこかにコピー・ペーストする必要があります。つまり、DRY非準拠の混乱が生じます。

は、私は、同じファイルにリンクとしての第2の時間を加算し、プロジェクトごとの項目ごとに定義持っていた私は何ができるかを考え出し:

#if SOMECONSTANT // true if file is PartialReadDAL.cs 
public partial abstract class ReadDAL 
#else // false if "file" is link called "PartialReadWriteDAL.cs" symlinking to PartialReadDAL.cs 
public partial abstract class ReadWriteDAL 
#endif 
and here some implementation. 

しかし、私は何とかコンパイラ定数あたりを定義することができますファイル?
または、同様の効果が得られますか?

+0

メソッドをインターフェイス上の拡張メソッドとして実装できますか? –

+0

@Lucas Trzesniewski:まず、私は拡張メソッドを望んでいません。二番目のおそらく、私がしたい場合でも。 –

+0

アイデア: 'ReadDAL'と' WriteDAL'(インスタンスがコンストラクタに渡されるか、適切なデフォルトが仮定される)への転送メソッドを生成するT4テンプレートから 'ReadWriteDAL'を生成します。本質的に、 'ReadWriteDAL'には興味深いコードは含まれていないので、おそらくコンピュータで書き込むことができます。コード生成を伴わない別の考え方は、 'ReadWriteDAL'暗黙の変換演算子に'(I)ReadDAL'と '(I)WriteDAL'に適切なインスタンスを返すだけです。これは本物のものとまったく同じくらい良いとは言えませんが、それは近いです。どちらの考えも構図に依存しています。 –

答えて

0

symlinkのルートは非常に混乱します。これを行うことを余儀なくされたら、事前ビルドのステップとして関連するファイルに#defineをいくつか追加して実装します。次に、これらのシンボルがコード内に存在するかどうかを確認するために#ifとします。私はこれを一切好きではないでしょう:私の推測では、ビルドの終了後にこのマーカーをクリアしても、これが透明ではないので、バージョンコントロールには入りません。

ReadWriteDALには、それ自身の状態が含まれていますか、またはReadDALWriteDALにメソッド呼び出しのディスパッチャになる予定ですか?単なるディスパッチャの場合は、dynamic proxy mechanismを使用して、実際の実装(ReadWriteDAL)を削除し、IReadDALおよびIWriteDALへの呼び出しをコンポジションルートに登録して渡すことを検討してください。私はCastle Windsorのためにa tool like thatを書きました。

関連する問題