2016-04-18 10 views
0

は、私は以下のようにインタフェースを持っている:実装されたクラスが特定のパラメータを持つエンティティを使用するように強制する方法はありますか?

public interface IRepository<T> where T : class 
{ 

Tは私のエンティティのタイプです。
このインターフェイスには、EntityのIdプロパティを使用するいくつかのメソッドがあります。ですから、どうすればこのインタフェースを実装したいのですが、エンティティにはIdプロパティがありますを保証するにはどうすればいいですか?

答えて

3

レスキューへのインターフェイス!

次のようにインターフェイスを定義します。

// Why IEquatable<T>? Because you don't want identifiers that may not 
// be able to prove that they're equal or not. Most commonly used 
// types used as identifiers already implement IEquatable<T>. For example: 
// int, Guid... 
public interface ICanBeIdentifiable<TId> where TId : IEquatable<TId> 
{ 
    TId Id { get; } 
} 

を...そして、あまりにも次のようにリポジトリのインターフェース署名を変更します。

public interface IRepository<T> where T : class, ICanBeIdentifiable<Guid> 
... 

...またはあなたは絶対にドアを開く場合任意の識別子タイプ:

public interface IRepository<TId, T> 
      where TId : IEquatable<TId> 
      where T : class, ICanBeIdentifiable<TId> 

主な欠点は、ドメインオブジェクトがまったく新しいインターフェースですが、それはその価値があります。

1

あなたはIdプロパティを持っているすべてのエンティティをプッシュする追加のインターフェースを追加することができます

public interface IEntity 
{ 
    int Id { get; set; } 
} 

public interface IRepository<T> where T : class, IEntity 
{ 

} 
関連する問題