1

我有一个丰富的域,所以我想将域模型与持续模型分开,这是所有域驱动设计从业人员推荐的。 假设我有一个下列丰富的域模型:实体框架映射到域对象

public class Order 
{ 
    Public Guid Id {get; private set;} 
    Public Property1 {get; private set;} 
    Public Property2 {get; private set;} 

    private List<Item> Items; 
    Public AddItem() { } 
    .... 
} 

这是我的数据传输Obect(实体框架在使用它):

public class OrderDTO 
{ 
    public Guid Id {get; set;} 
    Public Property1 {get; set;} 
    Public Property2 {get; set;} 
    ... 
} 

实体框架的DbContext:

public partial class EntityFrameworkContext : DbContext 
{ 
    ... 
    public virtual DbSet<OrderDTO> Orders{ get; set; } 
    ... 
} 

库:

public class OrderRepository : IOrderRepository 
{ 
    private EntityFrameworkContext _context; 
    .... 
    public IQueryable<Order> FindBy(Expression<Func<Order, bool>> predicate) 
    { 
     //how to implement this ?? 
    } 
} 

我如何实现方法FindBy?我不能使用_context.Orders.where(谓词),因为entitiy框架上下文适用于OrderDTO而不适用于Order。我需要某种方式之间的映射Func<Order, bool>Func<OrderDTO, bool>

任何帮助将appriciated。

+0

对不起我的错误。它应该是Order。我现在改了它。 – Lahmacun

+0

'实体框架ist使用它“第三个词是什么意思? – mjwills

+0

我使用Automapper将实体映射到DTO。但是在我的项目中,我在存储库和域之间有一个层。该层(服务层)接受DTO,映射到实体并调用存储库。这样我的存储库只关心实体,我的视图只关心DTO,服务层完成剩下的工作。 – garethb

回答

0

如果你使用OrderDTO构建谓词表达

public class OrderRepository : IOrderRepository 
{ 
    private EntityFrameworkContext _context; 
    .... 
    public IQueryable<Order> FindBy(Expression<Func<OrderDTO, bool>> predicate) 
    { 
     return ConvertToDomainModel(_context.Orders.where(predicate); 
    } 
} 
+0

这种方法需要OrderRepository的客户端知道OrderDTO和Order。客户端是域模型,我不希望域模型知道OrderDTO。我希望领域模型是持久性无知的。 – Lahmacun

+0

您的域模型不应该包含'private EntityFrameworkContext _context;'这应该在您的服务或持久性模型中 – MJK