属性Users与IRepository.Users的区别
本文关键字:Users 区别 属性 IRepository | 更新日期: 2023-09-27 18:10:56
我有一个接口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; } }
}
我不理解Repository
类的User
属性用户
这段代码可以编译,我不知道为什么。
属性名称前的接口名称是什么?
这是有效的语法,称为显式接口实现。它在两种情况下很有用:
- 当你用相同的方法实现两个接口时(检查上面的链接)
- 当你想在某种意义上"隐藏"一个实现细节时。在你的例子中,如果用户有
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强制转换为iccollection)。
Repository类中的Users属性的返回类型与接口的返回类型不同。为了满足接口的需求,还需要从IRepository接口显式地实现Users属性。
你可以在这里找到关于显式接口实现的更详细的讨论:隐式与显式接口实现
它的类型,这个属性返回一个IQueryable泛型接口。它是Interface IQueryable的一个特定类型,它是为user通用创建的。
IQueryable是接口但是它是IQueryable接口的一个特殊版本,它只接受user类型的对象。
请参阅泛型的介绍http://msdn.microsoft.com/en-us/library/ms379564 (v = vs.80) . aspx