Абстрагирование поставщика ORM - PullRequest
1 голос
/ 16 февраля 2012

В моем приложении ASP.NET MVC 3 сейчас я должен использовать EF4.3 в качестве платформы ORM. Я хочу иметь возможность заменить его в будущем, в случае необходимости. Это требует определения интерфейса, который будет указывать на реализацию DbContext в случае EF.

Что я определяю в своем интерфейсе для запрашиваемого объекта?

Например, в моем случае я собираюсь сделать следующее, но не знаю, правильный ли это путь:

в моем интерфейсе:

    IQueryable<AnonymousUser> AnonymousUsers { get; }

    int SaveChanges();

в моем DbContext:

    public DbSet<AnonymousUser> AnonymousUsers { get; set; }

    IQueryable<AnonymousUser> IThoughtCatStorage.AnonymousUsers
    {
        get { return AnonymousUsers; }
    }

Как видите, использование IQueryable - это один из способов абстрагирования DbSets.

Это лучший способ? (Я знаю, это звучит довольно дискуссионно, но я просто хочу знать, существует ли в настоящее время более обобщенный способ определения интерфейса доступа ORM.)

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Не используйте свой OR / M везде.Используйте классы репозитория, чтобы абстрагировать OR / M и упростить юнит-тестирование вашего кода.Это также устраняет дублирование кода и упрощает поддержку кода в будущем.

Преимущество для вас заключается в том, что вам нужно только изменить классы репозитория, если вам потребуется переключить OR / M в будущем.1003 *

Не забывайте, что мы все выбираем OR / M по определенной причине (функции, которыми обладает ваш любимый OR / M).Абстрагируя OR / M за общим слоем OR / M, вы также исключаете возможность использования этих функций.

1 голос
/ 16 февраля 2012

В прошлом я писал пост в блоге именно об этом:

Подделка вашего поставщика LINQ, часть 1

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