Какова актуальность шаблона Generic Repository в .Net Core с Entity Framework

Я пытаюсь (и не могу) понять цель универсального шаблона репозитория в конкретном случае, когда он обернут вокруг Entity Framework или EF Core.

какая польза от написания этого:

public void Update(T obj)
{
    DbContext.Set<T>().Attach(obj);
    DbContext.Entry(obj).State = EntityState.Modified;
    DbContext.SaveChanges();
}

Когда вы получите то же самое и даже больше, просто написав это как

public void Update(Movie obj)
{
    DbContext.Set<Movie>().Attach(obj);
    DbContext.Entry(obj).State = EntityState.Modified;
    DbContext.SaveChanges();
}

или

public void Update(Movie obj)
{
    var movie = DbContext.Movies.FirsOrDefault(x => x.MovieId == obj.MovieId);
    DbContext.Entry(movie).CurrentValues.SetValues(obj);
    DbContext.SaveChanges();
}

Я предполагаю, что мой настоящий вопрос заключается в том, почему мы оборачиваем универсальное репо вокруг того, что в основном уже является общим репозиторием (с большим количеством функций и оптимизаций)?

1 ответ

Решение

Не проявляя излишней самонадеянности, я хотел бы ответить на свой вопрос, основанный на ветке комментариев.

Общий шаблон репозитория - это пережиток времен, предшествовавших эпохе объектно-реляционных сопоставлений (ORM), таких как Entity Framework, xHibernate, Dapper, PetaPoco и миллиона других.

С появлением ORM все функции, обнаруженные в шаблоне репозитория, инкапсулированы в самом ORM.

Например, Entity Framework по умолчанию использует Transaction/UnitOfWork каждый раз, когда вы вызываете .SaveChanges() в DbContext.

Он также автоматически отслеживает изменения, внесенные в объекты, возвращаемые запросом, если вы явно не укажете ему не делать этого с помощьюUseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking).

Что касается общих репозиториев, как вы думаете, что это за код:

MyDbContext.Set<WeatherForecast>().Add(forecast);
Другие вопросы по тегам