При использовании VS2013, Entity Framework 6 и WebAPI 2 используется общий репозиторий и избыточный уровень UoW?

c# entity-framework-6 generic-collections generics

Вопрос

Я пересматриваю мою реализацию общей единицы работы и структуры репозитория .

Я использую EF6 и VS2013. Таким образом, VS содержит шаблоны контроллера WebAPI, которые автоматически генерируют WebAPI 2 OData Controller с помощью Actions, используя код Entity Framework следующим образом:

// GET odata/UserProjects(5)/WebsiteRequiredKeywords
        [Queryable]
        public IQueryable<WebsiteRequiredKeyword> GetWebsiteRequiredKeywords([FromODataUri] int key)
        {
            return _db.Websites.Where(m => m.WebsiteId == key).SelectMany(m => m.WebsiteRequiredKeywords);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                _db.Dispose();
            }
            base.Dispose(disposing);
        }

        private bool WebsiteExists(int key)
        { . . .

При взгляде на класс CustomerController в примере кода - все это очень хорошо знакомо с автоматически сгенерированным кодом в шаблоне VS2013. Если бы я использовал общую структуру, мне пришлось бы реорганизовать автоматически сгенерированный код, чтобы использовать синтаксис общего репозитория, изменить конструктор и т. Д. Хотя я уверен, что есть способ изменить процесс создания шаблона, чтобы он соответствовал в этот общий репозиторий (или добавьте наш собственный шаблон в шаблон VS) - этот объем работы кажется ненужным.

В общем шаблоне лесов используется тот же контекст базы данных. Насколько я понимаю, это синонимом единицы работы.

Я пытаюсь теперь найти ценность в выполнении любой из этих дополнительных работ. Хотя я успешно использовал общий репозиторий и единицу рабочих шаблонов в предыдущих проектах, для новых, это просто больше работы, чем это стоит (так как существует некоторое дублирование концепции b / t EF и этот шаблон)?

-- ОБНОВИТЬ --

С некоторыми незначительными изменениями в автоматически сгенерированный код, что мне нужно сделать после реализации чего-то вроде этого:

public class ProjectEditorController : ODataController
{
    //private MyDatabaseNameContext db = new MyDatabaseNameContext();  // auto-generated code

    private DbContext _db;

    public ProjectEditorController(DbContext dbContext)
    {
        _db = dbContext;
    }
    . . .

Проблема с этим кодом заключается в том, что теперь нет конкретного контекста и делаются такие вещи, как:

return SingleResult.Create(_db.Websites.Where(website => website.WebsiteId == key));

... не будет работать, поскольку нет никакой конкретной связи между db и сущностями, т.е. Websites .

При использовании DI для WebAPI-контроллеров вам все равно нужно определить репозиторий. Это случай, когда, если я хотел бы вставить dbContext, мне нужно использовать общий репо?

Короче говоря, это точно: если вы хотите эффективно использовать инъекцию зависимостей, вам нужен общий репозиторий. В противном случае вам необходимо определить интерфейс репозитория для всех ваших объектов EF, если только вы не используете распознаватель IDependency, как это предлагается в конце этой статьи.

Принятый ответ

Ayende суммирует это довольно хорошо здесь . Не добавляйте абстракцию, которая вам не нужна.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему