2016-07-18 12 views
4

IDbSetとDbSetの違いは何ですか?

public IDbSet<Chrip> Chirps { get; set; } 

public DbSet<Chrip> Chirps { get; set; } 

の違いは何ですが、彼らは同じですか?

+1

1つはインターフェイスをもう一方のクラスに公開し、どちらも同じではありません。 – juharr

+0

いいえ、それらは同じではありません。このような質問にはより多くの文脈が必要です - あなたは継承を理解していますか?クラスとインタフェースの違いは?より良い答えを得るためにあなたの質問についてのより多くの情報を提供してください。 – Jonesopolis

答えて

1

通常、タイプ名が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を参照してください。

13

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と信じています。

関連する問題