属性用户和IRepository.Users之间的区别

时间:2011-10-08 18:39:30

标签: c# architecture interface

我有一个接口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属性用户。

这段代码编译,我想知道为什么。

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

3 个答案:

答案 0 :(得分:4)

这是有效的语法,称为Explicit Interface Implementation。它在两种情况下很有用:

  • 当您使用相同的方法实现2个接口时(请查看上面的链接)
  • 当你想在某种意义上“隐藏”实现细节时。在您的示例中,如果用户具有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