У меня есть интерфейс под названием IRepository. Этот интерфейс определяет набор таких общих методов, как:Liskov Замена Принцип и избыточные методы
IQueryable<T> Get<T>() where T : class;
void Add<T>(T obj) where T : class;
void Update<T>(T obj) where T : class;
void SaveChanges();
У меня тогда есть класс, который реализует этот интерфейс. Этот класс фактически использует Entity Framework для реализации этих методов. Однако обновление метода избыточно, поскольку Entity Framework отслеживает изменения, сделанные для получаемых объектов, поэтому я просто получаю объект, который я хочу, обновляю, а затем вызываю SaveChanges. Однако в будущем я, возможно, захочу заменить эту конкретную реализацию IRepository чем-то другим. Который, вероятно, не будет отслеживать изменения, такие как инфраструктура Entity. Поэтому я думаю, что хочу оставить метод обновления в интерфейсе, но в моей конкретной реализации этого интерфейса просто оставьте метод, но ничего не делайте. например
public void Update<T>(T obj) where T : class
{
}
Это, кажется, в соответствии с Лисков принцип замещения, я могу заменить реализацию интерфейса с чем-то еще. Просто для того, чтобы некоторые вещи могли реализовать все методы, определенные на интерфейсе, возможно, не понадобилось.
Это хороший подход. Я думал, что это нормально, может быть, даже обозначить метод как устаревший в реализации IRepository, заявляя, почему он устарел в этой реализации.
Как-то странно, если у вас есть метод обновления, который ничего не делает, и это вызвано всем приложением, даже если оно на самом деле ничего не делает. Но тогда, если мы изменили реализацию IRepository, к внедрению, которое действительно нуждается в методе обновления, мы можем заменить это без необходимости изменения кода.
Это немного ортогонально вопросу, но, абстрагируя абстракцию (которая уже есть EF), вы почти автоматически теряете много энергии, которая приходит с ней (кеширование, как первого, так и второго уровня, если вы вводите один , отслеживание изменений и т. д.) ... –
Приятно читать: http://blog.ploeh.dk/2012/03/26/IQueryableTisTightCoupling/ и это: http://www.cuttingedge.it/blogs/steven/pivot/ entry.php? id = 92 – Fendy
Очень интересно прочитать, что он описывает именно тот интерфейс, с которым я столкнулся.Я предполагаю, что такой интерфейс делает ложные гарантии. Не все запросы будут гарантированы для работы, если я заменю реализацию. –