Entity Framework в многоуровневой архитектуре - PullRequest
6 голосов
/ 16 июля 2010

Недавно я прочитал статью " Entity Framework в многоуровневой архитектуре ", и там написано, что мы можем отправлять EF-сущности клиенту через WCF. Но во многих потоках в Stackoverflow люди говорят, что POCO (DTO) -объекты должны использоваться, когда мы используем WCF. И у меня есть несколько вопросов.

  1. Почему Microsoft добавила атрибут DataContract к EF-сущностям? Разве Microsoft хотела, чтобы мы использовали эти объекты везде в наших приложениях? Или это только для очень простых приложений и для быстрой разработки?

  2. Если я использую POCO-объекты, я должен создать автоматически сгенерированные EF-Entities, POCO-Entities и после этого использовать какую-либо библиотеку сопоставлений между ними? Или я должен использовать только POCO-объекты во всех компонентах моего приложения?

  3. Если у меня уже есть собственный бизнес-объект, у которого есть несколько методов, и он должен быть сопоставлен с объектом POCO, на каком уровне я должен преобразовать POCO-объект в свой объект (например, у меня есть уровень персистентности, уровень бизнес-логики, уровень обслуживания (WCF), уровень презентатора (клиент, использование WCF), уровень пользовательского интерфейса)? Или я не должен создавать такие свои сущности?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 16 июля 2010

Вам следует прочитать эту статью, чтобы узнать, подходит ли вам EF с POCO Работа с объектами POCO (Entity Framework)

3 голосов
/ 16 июля 2010

1. Почему Microsoft добавила атрибут DataContract к EF-сущностям?Разве Microsoft хотела, чтобы мы использовали эти объекты везде в наших приложениях?Или это только для очень простых приложений и для быстрой разработки?

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

2.Если я использую POCO-объекты, я должен создать автоматически сгенерированные EF-Entities, POCO-Entities и после этого использовать какую-либо библиотеку сопоставлений между ними?Или я должен использовать только POCO-объекты во всех компонентах моего приложения?

Вы можете использовать POCO-объекты внутри вашего сервисного уровня, чтобы отделить его от любых нижележащих слоев (см. Automapper, чтобы покрыть Entity-Стоимость картографирования DTO).но вы все равно можете использовать автоматически сгенерированные EF-сущности среди данных и бизнес-уровней в вашей архитектуре.просто постарайтесь не полагаться на особенности EF вашей сгенерированной модели предметной области в других слоях, отличных от слоя данных.чтобы упростить переход на другие платформы ORM.

Если у меня уже есть свой бизнес-объект, у которого есть несколько методов, и он должен быть сопоставлен с объектом POCO, на какой уровень мне следует преобразовать объект POCOмоей сущности (например, у меня есть уровень постоянства, уровень бизнес-логики, уровень обслуживания (WCF), уровень презентатора (клиент, использование WCF), уровень пользовательского интерфейса)?Или я не должен создавать такие собственные сущности?

Сервисный уровень http://msdn.microsoft.com/en-us/library/ms978717.aspx. вы бы прозрачно использовали модель своего домена на уровне сервера (постоянство, бизнес, сервис и уровень презентаторов)вашего приложения, и единственный уровень, который потребует от вас DTO-сопоставления, это сервисный уровень, см. вопрос 1. (дополнительно, если вы используете ViewModels внутри вашего уровня презентатора - хорошая идея - вам потребуется использовать POCO-отображение вслой презентатора тоже).

1 голос
/ 19 июля 2010

Вы можете иметь объекты POCO от руки и полностью отделенные от слоя постоянства. SDReys прав, используя созданные EF-сущности, так как ваша модель вонючая.

Вот примерный макет для простой модели POCO и контекст для ее поддержки.

public class MyApplicationContext : ObjectContext, IMyApplicationContext {   
    public MyApplicationContext() : base("name=myApplicationEntities", "myApplicationEntities")  
    {
  base.ContextOptions.LazyLoadingEnabled = true;
        m_Customers = CreateObjectSet<Customer>();
        m_Accounts = CreateObjectSet<Account>();
    }

 private ObjectSet<Customer> m_Customers;
 public IQueryable<Customer> Customers {
        get { return m_Customers; }
    }
 private ObjectSet<Account> m_Accounts;
 public IQueryable<Account> Accounts {
        get { return m_Accounts; }
    }

 public Account CreateAccount(Customer customer) {
  var account m_Accounts.CreateObject();
  account.Customer = customer;
  return account;
 }
 public Customer CreateCustomer() {
  return m_Customers.CreateCustomer();
 }

 public void AddAccount(Account account) {
  m_Accounts.AddObject(account);
 }
 public void AddCustomer(Customer customer) {
  m_Customers.AddCustomer(customer);
 }
}

public class Account {
    public int Balance {get;set;}
    virtual public Customer{get;set;}
}

public class Customer {
    public string Name {get;set;}
    virtual public List<Account> Accounts{get;set;}
}
...