代码之家  ›  专栏  ›  技术社区  ›  James Alexander

关于实体框架+DDD的问题

  •  3
  • James Alexander  · 技术社区  · 15 年前

    我很难找到直接在DDD模式中使用EF的例子。这也是我第一次使用DDD,对于解决方案布局和如何使用某些DDD模式有几个问题。

    1)我所看到的关于使用存储库模式w/ef的大多数示例只显示了专门的模型接口,例如IContactReportory,然后是实现接口的具体类型。理想情况下,我希望使用iRepository之类的东西,它具有CRUD操作的基本功能集。如果必要的话,我可以创建专门的存储库,比如IContactrepository:IRepository,因为我的大多数模型不需要扩展。我找错树了吗?有人能给我提供这种实现方式的例子吗?

    2)现在,我将我的解决方案分为以下三个项目:模型(包含我的EDM)、存储库和服务。这是合适的,还是有其他的布局方法我没有考虑,应该考虑?

    3)我已经看到了具有返回iQuery的查询(func<t>)/query()方法的存储库示例。这是臭的还是皱眉头的?

    3 回复  |  直到 12 年前
        1
  •  2
  •   Jarrett Meyer    14 年前

    我想回答3…

    我觉得它不那么“臭”,更“懒”。这是一个典型的“存储库”,我在互联网上看到过…

    public interface IRepository {
      // Query operations.
      IQueryable<T> All<T>();
      IQueryable<T> Find<T>(Expression<Func<T, bool>> expression);
      T Single<T>(Expression<Func<T, bool>> expression);
    
      // Save operations.
      T Add<T>(T objectToAdd);
      void Delete<T>(T objectToDelete);
      T Update<T>(T objectToUpdate);
    }
    

    据我所知,这不是一个存储库,而是一个“会话”或“工作单元”。这是一种方便的方法,可以抽象出您使用的任何数据库技术,而只需与一个非常通用的接口进行交流。所以我们把它重命名为 ISession 相反。这就是我最近一直在做的模式。

    public class PeopleRepository {
      private readonly ISession session;
    
      public PeopleRepository(ISession session) {
        this.session = session;
      }
    
      public virtual IEnumerable<Person> Active() {
        return session.Find<Person>(p => p.Active).OrderBy(p => p.LastName).ThenBy(p => p.FirstName);
      }
    
      public virtual IEnumerable<Person> ByLastName(string name) {
        return session.Find<Person>(p => p.Active && p.LastName.StartsWith(lastName)).OrderBy(p => p.LastName).ThenBy(p => p.FirstName);
      }
    
      public virtual void DeletePerson(int personId) { 
        // We don't really delete people; we mark them as inactive.
        var person = session.Single<Person>(p => p.Id == personId);
        person.Active = false;
        session.Update(person);
      }
    }
    

    在这个设置中, 遗赠 是到数据存储区的一般链接。这个 PersonRepository 但是,对于在 Person 对象。

    希望这有帮助。

        2
  •  2
  •   Mark Seemann    15 年前

    我们目前正在将ef与ddd结合使用,但我不得不说,在当前的实现中,ef不太适合这种体系结构。主要的问题是,ef当前工作的唯一方式是让每个“实体”从ef特定的基类派生。

    另一方面,存储库的关键是 摘要 放弃数据访问技术。DDD背后的全部思想是域模型应该 无约束的 通过实现细节,如数据访问技术的选择。这意味着应该定义域对象,使它们成为不知道持久性的对象。

    换句话说:您不能将ef“entities”用作域对象,因此在DAL中,必须手动编写许多代码,将域对象与ef“entities”之间的映射映射。很快就累了。

    我肯定会认为在存储库上使用iQueryable是一种泄漏的抽象,用ddd的说法,它没有多大意义。如果域对象是内聚单元,那么只从中选择某些“列”就没有什么意义。

    在EF for.NET 4.0中,我们会受到持久性的忽视,因此它在将来会变得更好…

        3
  •  0
  •   Andrew Peters    15 年前