2012-03-12 3 views
2

У меня есть два объекта в структуре сущности. Теперь я хочу отделить их, вставив интерфейс домена DAL в домен.Интерфейс (интерфейс в интерфейсе) в Entity Framework

Таким образом, конечный результат будет:

DAL

  • лицо: IPerson (EF Entity)
  • Книга: IBook (EF Entity)

домена

  • Интерфейсы (Папка)
    • IPerson
    • IBook
  • лицо (Domain лицо)
  • Book (Domain организация)

Теперь проблема, если мои Dal.Person иметь виртуальную книгу или IBook ? Как следует как DAL.Person, IPerson и Domain.Person выглядеть (дайте мне просто очень небольшой примеру взаимостыковки)

+0

Я не думаю, что DAL должен реализовывать интерфейс домена. – Jodrell

+0

@Jodrell http://dotnetslackers.com/articles/aspnet/Building-a-StackOverflow-inspired-Knowledge-Exchange-Three-Tiers-to-MVC-Hooray-Reversing-Dependencies.aspx говорит, что вам нужно удалить зависимости EF/L2SQL – Julian

+0

Является ли домен BLL или моделью? – Jodrell

ответ

1

EF не поддерживает работу с интерфейсами, так что вы не можете иметь public virtual IBook ... в вашем Person лица, если вам хотите использовать его как навигационное свойство, обрабатываемое EF.

+0

Тогда каков правильный способ удаления зависимости между сущностью и классами домена? – Julian

+2

Использование классов POCO. –

1

Ответ на ваш вопрос полностью зависит от вашей цели.

Если вы создаете интерфейсы уровня домена с логическим обоснованием, которое вы могли бы (на определенном этапе позже) обменять DAL из Entity Framework на нечто совершенно другое (например, сторонний веб-сервис или, возможно, сериализацию XML) то вы будете стремиться полностью разделить логику конкретного между Доменом и DAL.

Где возможно, вы хотите, чтобы ваш домен работать на доменном entites/интерфейсы и ваш DAL работать на DAL лиц/интерфейсов, в то время реализации интерфейсов, указанных в файле доступа к данным

Таким образом, ваш объект DAL DAL. Человек должен содержать объект «Книга» и реализовывать его через интерфейс IPerson на уровне домена.

Я дам несколько примеров, которые запрашивали

#region Domain Objects 


    public interface IPerson 
    { 
     List<IBook> Books { get; private set; } 
    } 

    public interface IBook 
    { 
     string Name { get; private set; } 
    } 

    #endregion 

    #region DAL/Entity Framework Auto Generated classes 

    public class Person : IPerson 
    { 
     public List<Book> Books {get; private set;} 
    } 

    public class Book : IBook 
    { 
     public string Name { get; private set; } 
    } 

    #endregion 

Вопреки Jodrells комментарий, я думаю, что если есть требование к «горячей замены» уровень доступа к данным не может быть случай для Уровень DataAccess реализует интерфейсные контракты, описанные в слое Domain.

Чтобы быть честным, очень редко, что я видел это требование - и, как правило, вам лучше всего расширять автоматически созданные классы Entity Framework (через partial) и обходить приложение, удаляя дублирование, которое потребуется путем указания объектов домена и самих контрактов. Итак, по существу, ваши классы Entity-Framework становятся вашим уровнем домена.

И я должен сказать, что вы должны использовать классы POCO согласно комментариям выше

+0

В моих niavety я предположил, что это был случай – Jodrell

+0

@Patrick McCurley Спасибо за ваш очень хороший комментарий! Хотя наличие классов инфраструктуры сущности становится моим доменным уровнем, это проблема для меня. Этот клиент хочет иметь быструю реализацию с Entity Framework для быстрой разработки. Но позже он хочет поменять весь EF с помощью простого SQL, так что это будет быстрее. На стороне, Ladislav (другой комментарий) говорит, что невозможно использовать интерфейсы в EF. – Julian

1

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

Я бы предложил реализовать слой репозитория.

Шаг 1

Начнем с простейшей модели - модели (Человек и книги) в домене и EF в DAL слоя, используя стандартную процедуру EF для кода первой. EF реализует функции репозитория в DbSet<Person> и DbSet<Book> (но, конечно, этот тип репозитория заблокирован в EF).

Сделайте приложение для работы с приложениями с этим шаблоном, вы можете быстро продемонстрировать функциональность. Это позволяет сосредоточиться на логике приложений и не слишком беспокоиться о сохранении.

Шаг 2

Поместите репозиторный класс или классы между доменом и DAL. Замените вызовы домена на DbSet<Person> и DbSet<Book> с звонками в IQueryable<Person> и IQueryable<Book> в репозитории. Коллекции хранилищ первоначально просто указывают на коллекции EF DbSet<>.

Внесите Save() в репозиторий. Первоначально он просто вызывает DbContext.SaveChanges().

Проверка функциональности остается неизменной.

Шаг 3

Заменить источник хранилища IQueryable<> «s с любой равносильна в новом DAL. Это может быть или не быть сложным, в зависимости от формы нового DAL.

Я следил за этим процессом - начал с XML-сериализованного DAL, переместил его в EF, реорганизовал одну таблицу обратно в локальный XML-файл, а следующим шагом будет реорганизация другой таблицы в веб-службу на ESB.

BTW, вы упомянули о замене EF на SQL для производительности. Мы обнаружили, что EF замедляется для объемных вставок из-за стиля строки за строкой, который он использует.

Чтобы обойти это, я внедрил SqlBulkCopy в репозиторий, основанный на EF (вместо оптовой замены EF, который имеет другие функции, которые нам действительно понравились). Это быстро, но требуется время, чтобы скомпоновать.

0

У меня была эта проблема для AGES.

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

В основном вы подвергаете две ссылки в вашем - в вашем конкретном классе - один implemetents Ibook книги и один, который реализует книги BookNavigation

первым реализует требования интерфейса (IBook) и второй реализует конкретный класс сделайте EF Happy. Затем вы привязываете их к ТАБЛИЦЕ, лежащей в основе отдельной книжной книги.

я объяснить это более подробно здесь:

http://bretthargreaves.wordpress.com/2014/11/11/entity-framework-and-interface-issues/