さまざまな実装をサポートするはずの汎用データ アクセス レイヤーがあるとします。これを実現するためIPeristenceService
に、永続層内のデータにアクセスするためのすべてのメソッドを定義する基本インターフェースがあります。インターフェイスは次のようになります。
public interface IPersistence
{
TData GetData<TData, TKey>(TKey Key);
}
したがって、永続化サービスは、インターフェースによってのみ定義されるオブジェクトのインスタンスを作成することはできません。そのため、メソッドの実装を制限することは適切な決定GetData
です。
public interface IPersistence
{
TData GetData<TData, TKey>(TKey Key) where TData : class, new();
}
このインターフェイスを実装している開発者は、インターフェイス ポインターを返そうとするとコードをコンパイルできないため、これは非常に簡単です。永続化レイヤー内のデータは、インターフェイスではなく、実装されたオブジェクトで表す必要があります!
ここで、エンティティによって表されるリレーショナル データベース内のデータを永続化する永続化サービスを作成しているとします。すべてのエンティティは、1 つの基本インターフェイスから継承しています: IEntity
. 永続化サービスはエンティティのみを永続化できるため、非エンティティ オブジェクトの受け渡しは失敗する必要があります。したがって、渡されたオブジェクト インスタンスが から継承されているかどうかを検証する必要がありますIEntity
。where 表記を使用すると、コンパイル時にこれが可能になりますが、次のようなインターフェイスを実装するだけです。
public class DbPersistence : IPersistence
{
public TData IPersistence.GetData<TData, TKey>(TKey Key)
where TData : IEntity, class, new();
{
// fancy data access code
}
}
動作しませんよね?
私がやろうとしていることを理解する方法はありますか?
前もって感謝します :-)