属性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属性用户

这段代码可以编译,我不知道为什么。

属性名称前的接口名称是什么?

属性Users与IRepository.Users的区别

这是有效的语法,称为显式接口实现。它在两种情况下很有用:

  • 当你用相同的方法实现两个接口时(检查上面的链接)
  • 当你想在某种意义上"隐藏"一个实现细节时。在你的例子中,如果用户有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