Вопрос

Что такое альтернативные шаблоны использования для Entity Framework?

Некоторые из тех, кого я знаю, это:

<Ол> <Литий> <р> & Quot; Обычная & Quot; EntityFramework - он же Unity of Work <Код>

using (Data.Model c = new Data.Model())
{
    var z = c.Users.Where(x=>x.Name=='John');
}

  • Шаблон репозитория <Код>

    //Model implements IRepository
    User user = Model.Instance.Get<User>(u => u.Name == "John");
    

  • Что еще?
  • Это было полезно?

    Решение

    Хорошей книгой является книга Мартина Фаулера " Шаблоны архитектуры корпоративных приложений ".

    Там он проходит через несколько шаблонов для извлечения / отображения данных, таких как DTO, Единица работы, шаблон репозитория и т. д. Возможно, что-то может быть полезно вместе с Entity Framework. Я должен был бы взглянуть на это.

    Другие советы

    Я отвечаю на ваш вопрос, исходя из предположения, что вы используете Entity Framework непосредственно в своем пользовательском интерфейсе / контроллере / сервисах.

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

    Второй подход, т. е. «Модель реализует репозиторий». на мой взгляд, это также неправильно, поскольку модель и репозитарии имеют разную ответственность и основаны на «единой ответственности»; часть твердых принципов, вы не должны объединять две концепции вместе. Даже если вы хотите использовать шаблон Active Objects в своей модели, который я не рекомендую, вы должны отделить свою модель от используемой ORM.

    Лучшее и наиболее рекомендуемое решение - иметь интерфейс, такой как IRepository или IRepository, с самыми базовыми элементами, как предлагает шаблон. что-то вроде:

    Interface IRepository<T> where T:class
    {
        void Insert(T entity);
        void Update(T entity);
        void Delete(T entity);
    
        // if you don't want to return IQueryable
        T FindById(object id);
        IEnumerable FindXXXXX(params)
    
        // if you prefer to return an IQueryable
        IQueryable<T> Find(Expression<Func<T, bool>> predeicate);
    }
    

    Обратите внимание, что некоторые репозитории людей не должны возвращать IQueryable. Кроме того, вы можете использовать ISpecification вместо выражений и лямбда-выражений.

    вам нужно будет реализовать интерфейс IRepositoy для большинства ваших объектов. Используя этот подход, вы также можете высмеивать ваши репозитории при написании модульных тестов. В производственной среде вам нужно будет использовать провайдера Ioc, такого как Unity, Ninject, Linfu, Catsle и т. Д., Вы также можете воспользоваться реализацией общего локатора служб microsoft, чтобы избежать подключения к конкретной инфраструктуре IoC.

    В прежние времена у меня был интерфейс доступа к данным, который был реализован для конкретной бизнес-области или службы. Одна из проблем этого подхода заключается в том, что в результате вы получите дублирующий код в разных службах доступа к данным, если будете отслеживать исходный код и в конечном итоге это сделаете.

    Мы используем код, аналогичный тому, который есть в вашем примере с единицей работы.

    Кроме того, мы делаем привязку объектов к объектам передачи данных.

    Есть много статей на эту тему, но список будет значительно сокращен, если вы хотите хорошую. Эта статья из журнала MSDN довольно хорошо, хотя он имеет дело с n-уровневыми приложениями. Но так как вы не говорите, что строите, возможно, это поможет.

    LINQ 2 SQL может быть альтернативой. Вот статья Внедрение зависимостей с Unity и Linq to SQL DataContexts

    UNITY - http://unity.codeplex.com/

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top