Разница между свойством Users и IRepository.Users - PullRequest
0 голосов
/ 08 октября 2011

У меня есть интерфейс IRepository для абстрагирования моего хранилища. DbContext класс - это Entity Framework для работы с 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 ]

4 голосов
/ 08 октября 2011

Это допустимый синтаксис, называемый Явная реализация интерфейса . Это полезно в 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. осущ. Вы можете реализовать первый метод, но скрыть его от пользователя (по крайней мере, до тех пор, пока он не преобразует Dictionary в ICollection).
1 голос
/ 08 октября 2011

Свойство Users в классе Repository имеет тип возвращаемого значения, отличный от интерфейса.Для удовлетворения требований интерфейса также существует явная реализация свойства Users из интерфейса IRepository.

Более подробное обсуждение явных реализаций интерфейса вы найдете здесь: неявная или явная реализация интерфейса

0 голосов
/ 08 октября 2011

Тип, это свойство возвращает универсальный интерфейс IQueryable. Т.е. это особый тип интерфейса IQueryable, который был создан для пользователя в общем.

IQueryable это интерфейс но это специальная версия интерфейса IQueryable, которая принимает только объекты типа user.

Пожалуйста, смотрите это введение в дженерики http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...