public IDbSet<Chrip> Chirps { get; set; }
と
public DbSet<Chrip> Chirps { get; set; }
の違いは何ですが、彼らは同じですか?
public IDbSet<Chrip> Chirps { get; set; }
と
public DbSet<Chrip> Chirps { get; set; }
の違いは何ですが、彼らは同じですか?
通常、タイプ名がI
で始まる場合、それはインターフェイスです。これは厳しいルールではなく、命名規則です。
DbSet
はおそらくIDbSet
を実装あなたはクラスがこれが意味することは、あなたのことである。この
public class Foo : IFoo
{
public int Echo(int bar)
{
return bar;
}
}
ようなインターフェイスを実装し、この
public interface IFoo
{
int Echo(int bar);
}
のようなインターフェースを持っていると仮定クラスFoo
は必須ですインターフェイスが指示するすべてのメソッドを実装します。この場合はEcho
というメソッドがあり、int
を入力とし、int
を返します。
これは、どのように実装されているかわからなくても、さまざまなクラスを同じ方法で扱うことを可能にします。詳細については、Polymorphismを参照してください。
Sam I am's answerは、インターフェイスとクラスの違いをきちんと定義しますが、コードで使用するものを選択する際にはさらに考慮すべき点があります。
具体的には、クラスは複数のインターフェイスを実装できます。また、で定義されていないメソッドとプロパティを実装することもできます。インターフェイス。この場合
、IDbSet<TEntity>
インタフェースはDbSet<TEntity>
クラスによって使用されるメソッドとプロパティの最もを定義し、すべてではないが、それらの。たとえば、FindAsync
,RemoveRange
およびSqlQuery
のメソッドは、具象クラスの実装にのみ存在します。あなたのコードでインターフェイスを使用する場合は、最初に具体的な型にキャストせずに利用できる特別なメソッドはありません。
はまた、the Remarks section in the MSDN for IDbSet<TEntity>
は別の興味深いポイントがあります。
IDbSet<TEntity>
は元々DbSet<TEntity>
のためにテストダブル(モックや偽物)の作成を許可することを意図していました。しかし、このアプローチは、新しいメンバをインターフェイスに追加すると、新しいメンバなしで既にインターフェイスを実装している既存のコードが破損するという問題があります。したがって、EF6から始めて、このメンバに新しいメンバは追加されません。DbSet<TEntity>
をテストダブルの基本クラスとして使用することをお勧めします。
私はそれはあなたがいないと正当な理由がない限り、あなたは通常、代わりにIDbSet<TEntity>
のDbSet<TEntity>
を使用してプロパティを宣言するべきであると言うことを考えてのことラインを拡張するために、安全なITと信じています。
1つはインターフェイスをもう一方のクラスに公開し、どちらも同じではありません。 – juharr
いいえ、それらは同じではありません。このような質問にはより多くの文脈が必要です - あなたは継承を理解していますか?クラスとインタフェースの違いは?より良い答えを得るためにあなたの質問についてのより多くの情報を提供してください。 – Jonesopolis