^

Young Anything I do that may help others, I'll post it here.

Unit of Work Pattern

工作单元模式

  • 让业务逻辑远离数据访问代码
  • 让业务逻辑远离追踪修改
  • 允许业务逻辑和逻辑事务一起工作

迭代器模式,分离了集合对象的遍历行为,抽象出一个迭代器类来负责遍历, 这样即可以做到不暴露集合内部结构,又可以让外部代码透明地访问集合内部数据。

aggregate负责收集聚合数据,然后交给iterator去操作遍历。

.NET的自带接口

UnitOfWork 连接起了Controllers与Repositorys, Controllers(业务逻辑)只需要定义各种数据操作的逻辑,然后直接利用UnitOfWork commit change就可以了。而无需关心底层的数据库连接,追踪修改。

// IUnitOfWork 可供MVC里的Controllers作为构造函数参数使用
public interface IUnitOfWork{
    IRepository<Employee> Employees{get;}
    IRepository<TimeCard> TimeCards{get;}
    void Commit();
}

public class SqlUnitOfWork: IUnitOfWork{
    public SqlUnitOfWork(){
        // 连接数据库 _context
    }
    
    public IRepository<Employee> Employees{
        get{
            if (_employees == null){
                _employees = new SqlRepository<Employee>(_context);
            }
            return _employees;
        }
    }
    
    public void Commit(){
        _context.SaveChanges();
    }
}

public class SqlRepository<T>: ISqlRepository<T> where T: class, Ientity{
    public SqlRepository(ObjectContext context){
        _objectSet = context.CreateObjectSet<T>();
    }
    
    public void Add(T newEntity){
        _objectSet.AddObject(newEntity);
    }
    
    // other DB operations
}

相关模式

  • 仓库模式