Entity Framework в n-Tier - PullRequest
       35

Entity Framework в n-Tier

1 голос
/ 21 июля 2011

Используя простой пример:

  • Уровень представления: aspx и код позади.
  • Бизнес-уровень: WCF с связанные логики
  • Уровень доступа к данным: WCF с структурой сущностей

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

Методы и связанная логика следующие.

Уровень доступа к данным:

public SampleEntity[] LoadSampleEntity()
{
   //retrieve SampleEntity from database.
}

Уровень бизнес-логики:

public SampleEntity[] GetSampleEntity()
{
   //call the proxy to access Data Access Tier
   //Call LoadSampleEntity()
}

Уровень представления:

protected void btn_OnClick()
{
   //call the proxy to access Business Logic Tier
   //Call GetSampleEntity()
   //SampleEntity[] sampleEntity=BusinessLogic.GetSampleEntity();
   //gridview.datasouce = sampleEntity
   //gridview.databind();
}

Учитывая эту структуру, если SampleEntity был изменен, все 3 уровня потребуют перекомпиляции.
Есть ли способ уменьшить необходимость повторной компиляции при добавлении нового свойства / столбца в SampleEntity.

Один из способов, над которым я работал, - это преобразование SampleEntity [] в тип данных с данными на уровне бизнес-логики и передача данных на уровень презентации. Однако при этом удаляется функция Intellisense EntityFramework на уровне презентации.

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Вы можете попробовать шаблон репозитория. Сначала у вас будет доменный слой объектов, который будет похож на ваши объекты Entity, этот доменный слой будет в своем собственном проекте / dll. Вы бы использовали что-то вроде AutoMapper для сопоставления значений из объекта Entity с объектом Domain через бизнес-уровень. Тогда уровень представления будет / может совместно использовать уровень объекта домена, таким образом вы абстрагируете уровень данных объекта за

IRepository<T>
{
   IEnumerable<T> GetAll();
   T GetById(int id);
   void Save(T saveThis);
   void Delete(T deleteThis);
}

Ваш тип T для каждой таблицы будет типом домена, и внутри этих методов вы будете сопоставлять тип сущности с типом вашего домена. Этот IRepository может быть вашим сервисным контрактом на доступ к Уровню данных.

Что касается вашего другого вопроса, любые изменения, которые вы вносите в объект сущности, должны быть отражены в объекте домена, но это можно сделать с помощью чего-то вроде AutoMapper. Я думаю, что в большинстве случаев вы не хотите совместно использовать тип данных EF или LinqToSql вплоть до представления или пользовательского интерфейса.

Поскольку это WCF, у вас может быть уровень домена в качестве сериализованных типов.

0 голосов
/ 25 июня 2014

Вас может заинтересовать использование открытого источника N-Tier Entity Framework , который использует Entity Framework на стороне сервера и создает всю инфраструктуру для построения n-уровневой архитектуры на основе WCF, включая EFкак API на стороне клиента.Взгляните на руководство пользователя фреймворка, доступное для загрузки на codeplex, оно содержит целый раздел, посвященный архитектурным аспектам.

...