美文网首页
FreeSql 在 asp.net core 中使用 UnitO

FreeSql 在 asp.net core 中使用 UnitO

作者: 叶先生_34e6 | 来源:发表于2020-04-24 10:39 被阅读0次

    本篇文章内容引导,FreeSql 如何在 asp.net core 项目中使用特性(注解) 的方式管理事务。

    UnitOfWorkManager 只可以管理 Repository 仓储对象的事务,直接 fsql.Insert<T>() 是不行的!!

    支持六种传播方式(propagation),意味着跨方法的事务非常方便,并且支持同步异步:

    • Requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,默认的选择。
    • Supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
    • Mandatory:使用当前事务,如果没有当前事务,就抛出异常。
    • NotSupported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    • Never:以非事务方式执行操作,如果当前事务存在则抛出异常。
    • Nested:以嵌套事务方式执行。

    第一步:配置 Startup.cs 注入

    //Startup.cs
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IFreeSql>(fsql);
        services.AddScoped<UnitOfWorkManager>();
        services.AddFreeRepository(null, typeof(Startup).Assembly);
    }
    
    UnitOfWorkManager 成员 说明
    IUnitOfWork Current 返回当前的工作单元
    void Binding(repository) 将仓储的事务交给它管理
    IUnitOfWork Begin(propagation, isolationLevel) 创建工作单元

    第二步:定义事务特性

    [AttributeUsage(AttributeTargets.Method)]
    public class TransactionalAttribute : Attribute
    {
        /// <summary>
        /// 事务传播方式
        /// </summary>
        public Propagation Propagation { get; set; } = Propagation.Requierd;
        /// <summary>
        /// 事务隔离级别
        /// </summary>
        public IsolationLevel? IsolationLevel { get; set; }
    }
    

    第三步:引入动态代理库

    在 Before 从容器中获取 UnitOfWorkManager,调用它的 var uow = Begin(attr.Propagation, attr.IsolationLevel) 方法

    在 After 调用 Before 中的 uow.Commit 或者 Rollback 方法,最后调用 uow.Dispose

    第四步:在 Controller 或者 Service 或者 Repository 中使用事务特性

    public class SongService
    {
        BaseRepository<Song> _repoSong;
        BaseRepository<Detail> _repoDetail;
        SongRepository _repoSong2;
    
        public SongService(
            BaseRepository<Song> repoSong,
            BaseRepository<Detail> repoDetail,
            SongRepository repoSong2)
        {
            _repoSong = repoSong;
            _repoDetail = repoDetail;
            _repoSong2 = repoSong2;
        }
    
        [Transactional]
        public virtual void Test1()
        {
            //这里 _repoSong、_repoDetail、_repoSong2 所有操作都是一个工作单元
            this.Test2();
        }
    
        [Transactional(Propagation = Propagation.Nested)]
        public virtual void Test2() //嵌套事务,新的(不使用 Test1 的事务)
        {
            //这里 _repoSong、_repoDetail、_repoSong2 所有操作都是一个工作单元
        }
    }
    

    是不是进方法就开事务呢?

    不一定是真实事务,有可能是虚的,就是一个假的 unitofwork(不带事务)

    也有可能是延用上一次的事务

    也有可能是新开事务,具体要看传播模式

    示范项目:https://github.com/dotnetcore/FreeSql/tree/master/Examples/aspnetcore_transaction

    相关文章

      网友评论

          本文标题:FreeSql 在 asp.net core 中使用 UnitO

          本文链接:https://www.haomeiwen.com/subject/cypxwhtx.html