我有一个接口IRepository
来抽象我的存储库。 DbContext
类是使用First Code的实体框架。
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; } }
}
我不理解User
类中的Repository
属性用户。
这段代码编译,我想知道为什么。
属性名称前的接口名称是什么?
答案 0 :(得分:4)
这是有效的语法,称为Explicit Interface Implementation。它在两种情况下很有用:
DbContext
引用,他将看到DbSet<User>
属性并且能够访问它,另一方面,如果您仅为您的用户IRepository
- 他只会看到IQueryable<User>
,让你隐藏它下面的东西。//编辑:实际上,我个人喜欢并在我的代码中使用的另一种用法:
Dictionary<K, V>
实现了ICollection<KeyValuePair<K, V>>
,因此它应该使用签名方法实现:void Add(KeyValuePair<K, V> kv)
,这个方法很难看,你更喜欢void Add(K key, V value)
,但你不能忽视第一个。用显式int。 IMPL。你可以实现第一种方法,但是将其隐藏在用户之外(至少只要他不将Dictionary转换为ICollection)。答案 1 :(得分:1)
Repository类中的Users属性具有与接口不同的返回类型。为了满足接口的要求,还有一个来自IRepository接口的Users属性的显式实现。
您将在此处找到有关显式接口实现的更详细讨论: implicit vs explicit interface implementation
答案 2 :(得分:0)
它的类型,此属性返回IQueryable的通用接口。即它是Interface IQueryable的特定类型,它通常是为用户创建的。
IQueryable是界面 但它是IQueryable接口的特殊版本,只接受user类型的对象。
请参阅此泛型介绍 http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx