Entity framework 实体框架/工作单元架构问题

Entity framework 实体框架/工作单元架构问题,entity-framework,architecture,Entity Framework,Architecture,我非常熟悉UoW、Repository模式等。但是看到Entity Framework模式的各种实现,我很好奇为什么有人会在他们的存储库中使用Save或Add方法。如果您使用存储库为您获取一个对象的新实例,我会想象有人已经这样做了 public Customer GetNewCustomer() { Customer customer = new Customer(); ... any initialization code here ... _context.Cust

我非常熟悉UoW、Repository模式等。但是看到Entity Framework模式的各种实现,我很好奇为什么有人会在他们的存储库中使用Save或Add方法。如果您使用存储库为您获取一个对象的新实例,我会想象有人已经这样做了

public Customer GetNewCustomer()
{
    Customer customer = new Customer();
     ... any initialization code here ...
    _context.Customers.AddObject(customer);
   return customer;
}
我知道在一些设计中,你可以简单地使用

Customer customer = new Customer(); 客户=新客户();
而且它没有附加到上下文的任何地方。然而,我是私有构造函数的粉丝,因此客户对象只有一个实例化点。考虑到这一点,在使用UoW模式时,在存储库中永远不要使用add/save方法,而只在IUnitOfWork接口上使用此功能,这难道没有意义吗?

当我使用Java中的Spring习惯用法时,工作单元(和事务)与服务相关联。他们使用模型和持久性对象来满足请求。使用方面对事务进行去标记


我不知道.NET是否遵循类似的想法,但它值得探索。拥有基于接口的POCO服务,并让它们拥有事务。

当我遵循Java中的Spring习惯用法时,工作单元(和事务)与服务相关联。他们使用模型和持久性对象来满足请求。使用方面对事务进行去标记


我不知道.NET是否遵循类似的想法,但它值得探索。拥有基于接口的POCO服务,让它们拥有事务。

我认为您的解决方案不正确。这将向当前工作单元添加空客户。这意味着,如果以后的代码决定不按当前工作单元保存客户,那么它将遇到困难

存储库有保存实体的方法是很常见的。您将结合域驱动设计中使用的两种模式

  • 存储库
  • 对象工厂
存储库的职责是检索或存储实体。目标工厂的责任是处理实体建设


顺便说一句,如果存储库不是实体(这将非常糟糕),那么您的实体的私有构造函数将无法在存储库中访问

我认为你的解决方案不正确。这将向当前工作单元添加空客户。这意味着,如果以后的代码决定不按当前工作单元保存客户,那么它将遇到困难

存储库有保存实体的方法是很常见的。您将结合域驱动设计中使用的两种模式

  • 存储库
  • 对象工厂
存储库的职责是检索或存储实体。目标工厂的责任是处理实体建设

顺便说一句,如果存储库不是实体(这将非常糟糕),那么您的实体的私有构造函数将无法在存储库中访问

…在服务器上不使用添加/保存方法是否有意义 当使用UoW模式时,存储库仅具有此功能 在IUnitOfWork界面上

是的,我认为在IUnitOfWork界面上只有Save方法是有意义的。但是,我不再使用EF的存储库模式。相反,我现在使用命令和查询模式

如果您仔细想想,EF DbContext实际上在做3件事:1.)它作为您的存储库用于读取实体状态,2.)作为您的存储库用于修改实体状态,以及3.)作为一个工作单元用于跟踪多个更改并将其合并到单个事务中以持久化状态更改

那么,为什么不将这3个职责分为3个不同的接口呢

public interface IUnitOfWork
{
    int SaveChanges();
}

public interface ICommandEntities : IQueryEntities
{
    void Create(Entity entity);
    void Update(Entity entity);
    void Purge(Entity entity);
}

public interface IQueryEntities
{
    IQueryable<AggregateRoot1> AggregateRoot1s { get; }
    IQueryable<AggregateRoot2> AggregateRoot2s { get; }
    IQUeryable<AggregateRootN> AggregateRootNs { get; }

    IQueryable<TEntity> EagerLoad<TEntity>(IQueryable<TEntity> query, 
        Expression<Func<TEntity, object>> expression)
        where TEntity : Entity;
}
公共接口IUnitOfWork
{
int SaveChanges();
}
公共接口ICommandEntities:IQueryEntities
{
无效创建(实体);
无效更新(实体);
无效清除(实体);
}
公共接口实体
{
IQueryable AggregateRoot1s{get;}
IQueryable AggregateRoot2s{get;}
IQUeryable聚合对象{get;}
IQueryable查询加载(IQueryable查询,
表达式(表达式)
式中:实体;
}
然后可以在DbContext类上实现这3个接口。这将保持接口的良好性和隔离性,并允许依赖关系只注入所需的DbContext方法

例如,您的域应该是持久性无知的,对吗?在这种情况下,不要在IUnitOfWork接口上提供任何域类依赖项。相反,在IoC合成根目录(或MVC操作筛选器)中处理IUnitOfWork。然后,查询和命令处理程序只处理ICommandEntities和IQueryEntities接口

…在服务器上不使用添加/保存方法是否有意义 当使用UoW模式时,存储库仅具有此功能 在IUnitOfWork界面上

是的,我认为在IUnitOfWork界面上只有Save方法是有意义的。但是,我不再使用EF的存储库模式。相反,我现在使用命令和查询模式

如果您仔细想想,EF DbContext实际上在做3件事:1.)它作为您的存储库用于读取实体状态,2.)作为您的存储库用于修改实体状态,以及3.)作为一个工作单元用于跟踪多个更改并将其合并到单个事务中以持久化状态更改

那么,为什么不将这3个职责分为3个不同的接口呢

public interface IUnitOfWork
{
    int SaveChanges();
}

public interface ICommandEntities : IQueryEntities
{
    void Create(Entity entity);
    void Update(Entity entity);
    void Purge(Entity entity);
}

public interface IQueryEntities
{
    IQueryable<AggregateRoot1> AggregateRoot1s { get; }
    IQueryable<AggregateRoot2> AggregateRoot2s { get; }
    IQUeryable<AggregateRootN> AggregateRootNs { get; }

    IQueryable<TEntity> EagerLoad<TEntity>(IQueryable<TEntity> query, 
        Expression<Func<TEntity, object>> expression)
        where TEntity : Entity;
}
公共接口IUnitOfWork
{
int SaveChanges();
}
公共接口ICommandEntities:IQueryEntities
{
无效创建(实体);
无效更新(实体);
无效清除(实体);
}
公共接口实体
{
IQueryable AggregateRoot1s{get;}
IQueryable AggregateRoot2s{get;}
IQUeryable聚合对象{get;}
IQueryable查询加载(IQueryable查询,
表达式(表达式)
式中:实体;
}
<