2017-10-13 8 views
2

IDはメソッドにIDを渡すだけで、そのエンティティが存在するかどうかをtrueまたはfalseで返すだけの妥当性チェックを実行するために使用します。私は私のリポジトリごとにこの実装をしたくないので、以下に示すように別のインターフェイスIValidityCheck<T> where T: DbSet<T>を作成しました。ジェネリックdbsetに依存性注入を使用するにはどうすればよいですか?<T>

public interface IValidityCheck<T> where T: DbSet<T> 
{ 
    bool IsValid(Guid id, T entitySet); 
} 

私の.netコアアプリケーションでは、このために依存関係を追加しようとしています。私は何かが好きです。

services.AddTransient<IValidityCheck<DbSet<School>>, ValidityCheck<DbSet<School>>>(); 

は、しかし、私は

タイプのようなエラーが出ます 「Microsoft.EntityFrameworkCore.DbSet」 型ジェネリック型でパラメータ「T」または方法 「IValidityCheck」として使用することはできません。 「Microsoft.EntityFrameworkCore.DbSet」 への暗黙の参照変換は、私はそれがwhere T: classに制約を変更すると、それが容易になります知っているが、私はへの制約をしたい

「> Microsoft.EntityFrameworkCore.DbSet」がありませんあなたが1つの以上のパラメータを必要とする場合があり

1):DbSet

+0

TはどのようにDbSetになりますか?私は別の汎用変数が必要だと思います –

+0

あなたの定義は無限回帰ループのようです。 'public interface IValidityCheck ここで、T:DbSet 'と 'services.AddTransient 、School>、ValidityCheck 、School >>();' –

答えて

2

に特異的であるあなたは、2つのオプションがあります。このように:

public interface IValidityCheck<T, I> where T: DbSet<I> 

とこのようにそれを使用します。一般的な

public interface IValidityCheckBase<T> where T: class 
{ 
    bool IsValid(Guid id, T entitySet); 
} 

public interface IValidityCheck<T> : IValidityCheckBase<DbSet<T>> 
{ 

} 

あなたの例:別の可能性は、あなたがDbSet離れにより1つの以上のインタフェースを抽象的に導入できることである

services.AddTransient<IValidityCheck<DbSet<School>, School>, ValidityCheck<DbSet<School>,School>>(); 

2)実装:

public class ValidityCheck<T> : IValidityCheck<T> 
    { 
     public bool IsValid(Guid id, DbSet<T> entitySet) 
     { 
      return false; 
     } 
    } 

そして、それはあなたがとにかくDbSetするためにそれを強制したいので、これはより簡潔でなければなりませんあなたのジェネリック型の使用状況にDbSetを宣言なくてもを動作するはずです:このDEMO

services.AddTransient<IValidityCheck<School>, ValidityCheck<School>>(); 

、私が代わりにList<T>を使用し、それは似ているはずです。私は個人的に2)オプションが好きです。デモでコードがコンパイルされているのが分かります。

関連する問題