我有一个接口IRepository来抽象我的存储库。DbContext类是一个使用第一个代码的实体框架。
public interface IRepository
{
IQueryable<User> Users { get; }
}
public class Repository : DbContext, IRepository
{
public DbSet<User> Users { get; set; }
IQueryable<User> IRepository.Users { get{ return Users; } }
}我不理解Repository类中的User属性user。
这段代码可以编译,我想知道为什么。
属性名称之前的接口名称是什么?
发布于 2011-10-09 02:43:20
这是有效的语法,称为Explicit Interface Implementation。它在两种情况下很有用:
DbContext引用,他将看到DbSet<User>属性并能够访问它,另一方面,如果您只向用户提供IRepository -他将只看到IQueryable<User>,这让您可以隐藏它下面的内容。//Edit:实际上,还有一个我个人喜欢的用法,也用在我的代码中:
Dictionary<K, V>实现了ICollection<KeyValuePair<K, V>>,所以它应该实现带有签名的方法:void Add(KeyValuePair<K, V> kv),这个签名很难看,你更喜欢void Add(K key, V value),但是你不能忽略第一个签名。带有显式int的。实施。您可以实现第一个方法,但对用户隐藏它(至少只要用户不将字典强制转换为ICollection).发布于 2011-10-09 02:44:31
Repository类中的Users属性具有与接口不同的返回类型。为了满足接口的要求,还从IRepository接口显式地实现了Users属性。
您可以在这里找到关于显式接口实现的更详细的讨论:implicit vs explicit interface implementation
发布于 2011-10-09 02:42:59
它的类型,此属性返回IQueryable的泛型接口。即它是一个特定类型的接口IQueryable,这是为用户一般创建的。
IQueryable是一个接口,但它是IQueryable接口的一个特殊版本,只接受user类型的对象。
请参阅泛型http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx简介
https://stackoverflow.com/questions/7698960
复制相似问题