2010-07-16 1 views
6

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

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

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

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

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

+2

Имейте в виду, что эта статья была написана 2 года назад. С тех пор многое изменилось. EF 4.0 предлагает новые функции, работает с poco, улучшает работу с wcf и так далее. – nemke

+0

Да, я понимаю. Я только пытаюсь решить, как разработать мое приложение. –

+0

Могу ли я спросить вас, что вы используете в своем пользовательском слое? – SDReyes

ответ

3

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

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

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

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

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

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

+0

Я бы предложил отправить POCOs клиенту, за исключением тех случаев, когда требуется технология, требующая от вас этого (службы RIA, очевидно, делают это, но мне нужно это подтвердить). Таким образом, вы можете выявить самый чистый сервисный уровень. – SDReyes

+0

Большое спасибо. И если я решит изменить EF на другой ORM, я должен также изменить уровень сервиса, верно? –

+0

Точно. бизнес и уровень обслуживания. Таким образом, вам не придется беспокоиться о заполнении и обработке DTO до границы вашего решения, уровня обслуживания. – SDReyes

1

Вы можете иметь 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;} 
} 
Смежные вопросы