2009-03-04 10 views
1

Я пытаюсь найти лучший способ работы с объектами в инфраструктуре сущности. Я не хочу, чтобы мои формы ничего не знали об ObjectContext, поэтому я поместил всю логику внутри сущностей (я пишу частичные классы). Я искал других людей и многого не встречал. Итак, как вы работаете? Как вы получаете объект из ObjectContext и работаете с ним, не теряя его сущностей и все остальное? Я пришел к некоторому решению, но все еще удивляюсь другим. Благодарю.Entity constructors - Entity framework

ответ

3

После DDD давайте отделим ваши сущности от логики, которая работает на них. Лично я использовал шаблон репозитория, чтобы создать один общий репозиторий, а также некоторые специализированные репозитории, которые работают с моими сущностями. Репозиторий может работать с созданным конструктором ObjectContext или будет создавать новый (из конфигурации), если ни один не указан.

Мой пример IRepository интерфейс:

public interface IRepository<T> where T : class 
{ 
    /// <summary> 
    /// Return all instances of type T. 
    /// </summary> 
    /// <returns></returns> 
    IQueryable<T> All(); 

    /// <summary> 
    /// Return all instances of type T that match the expression exp. 
    /// </summary> 
    /// <param name="exp"></param> 
    /// <returns></returns> 
    IEnumerable<T> Find(Func<T, bool> exp); 

    /// <summary>Returns the single entity matching the expression. 
    /// Throws an exception if there is not exactly one such entity.</summary> 
    /// <param name="exp"></param><returns></returns> 
    T Single(Func<T, bool> exp); 

    /// <summary>Returns the first element satisfying the condition.</summary> 
    /// <param name="exp"></param><returns></returns> 
    T First(Func<T, bool> exp); 

    /// <summary> 
    /// Mark an entity to be deleted when the context is saved. 
    /// </summary> 
    /// <param name="entity"></param> 
    void Delete(T entity); 

    /// <summary> 
    /// Create a new instance of type T. 
    /// </summary> 
    /// <returns></returns> 
    T CreateInstance(); 

    /// <summary>Persist the data context.</summary> 
    void SaveAll(); 
} 
2

Примеры как поставить рамки сущности 4 в п-уровневой Архитектуры в порядке сложности:

  1. http://devtalk.dk/2009/06/09/Entity+Framework+40+Beta+1+POCO+ObjectSet+Repository+And+UnitOfWork.aspx
  2. http://blog.keithpatton.com/2009/05/30/Entity+Framework+POCO+Repository+Using+Visual+Studio+2010+Net+40+Beta+1.aspx
  3. http://danielwertheim.files.wordpress.com/2009/12/putting-entity-framework-4-to-use-in-a-business-architecture-v2.pdf
  4. http://www.simonsegal.net/blog/2010/01/11/entity-framework-repositories-fetching-strategies-specification-and-mapping-using-nfetchspec-for-role-driven-development-parts-1-4

Кстати, если бы вы предпочли реализовать интерфейс, отправленный @twk, используйте синтаксис IEnumerable<T> Find(Expression<Func<T, bool>> exp); для всей операции запроса. Внедрение IEnumerable<T> Find(Func<T, bool> exp); приведет к материализации всей таблицы и фильтрации в памяти.

Смежные вопросы