当前位置: 首页 > news >正文

购物网站的英文化学网站建设

购物网站的英文,化学网站建设,济阳网站建设,站长聚集地CAPCAP 是一个基于 .NET Standard 的 C# 库#xff0c;它是一种处理分布式事务的解决方案#xff0c;同样具有 EventBus 的功能#xff0c;它具有轻量级、易使用、高性能等特点。https://github.com/dotnetcore/CAPADO.NET事务1.DotNetCore.CAP.MySql中引用 了如下类库.在Co… CAPCAP 是一个基于 .NET Standard 的 C# 库它是一种处理分布式事务的解决方案同样具有 EventBus 的功能它具有轻量级、易使用、高性能等特点。https://github.com/dotnetcore/CAPADO.NET事务1.DotNetCore.CAP.MySql中引用 了如下类库.在Commit事务时会调用 Flush方法推送消息PackageReference IncludeMicrosoft.EntityFrameworkCore Version3.1.7 / PackageReference IncludeMicrosoft.EntityFrameworkCore.Relational Version3.1.7 / PackageReference IncludeMySqlConnector Version1.0.1 / https://github.com/dotnetcore/CAP/blob/master/src/DotNetCore.CAP.MySql/ICapTransaction.MySql.cs    public class MySqlCapTransaction : CapTransactionBase{public MySqlCapTransaction(IDispatcher dispatcher) : base(dispatcher){}public override void Commit(){Debug.Assert(DbTransaction ! null);switch (DbTransaction){case IDbTransaction dbTransaction:dbTransaction.Commit();break;case IDbContextTransaction dbContextTransaction:dbContextTransaction.Commit();break;}Flush();}} 其中我们能看到事务的提交会调用父类CapTransactionBase中的方法Flush。他是protected类型的并未开放出此接口。       protected virtual void Flush(){while (!_bufferList.IsEmpty){_bufferList.TryDequeue(out var message);_dispatcher.EnqueueToPublish(message);}} 我们来看一下集成 的demo调用    [Route(~/adonet/transaction)]public IActionResult AdonetWithTransaction(){using (var connection  new MySqlConnection(AppDbContext.ConnectionString)){using (var transaction  connection.BeginTransaction(_capBus, true)){//your business codeconnection.Execute(insert into test(name) values(test), transaction: (IDbTransaction)transaction.DbTransaction);//for (int i  0; i  5; i)//{_capBus.Publish(sample.rabbitmq.mysql, DateTime.Now);//}}}return Ok();} https://github.com/dotnetcore/CAP/blob/master/src/DotNetCore.CAP.MySql/ICapTransaction.MySql.cs代码中通过扩展IDbConnection类增加BeginTransaction方法传递了注入的_capBus类,传了autoCommitprivate readonly ICapPublisher _capBus;public PublishController(ICapPublisher capPublisher) {_capBus  capPublisher; } /// summary /// Start the CAP transaction /// /summary /// param namedbConnectionThe see crefIDbConnection /./param /// param namepublisherThe see crefICapPublisher /./param /// param nameautoCommitWhether the transaction is automatically committed when the message is published/param /// returnsThe see crefICapTransaction / object./returns public static ICapTransaction BeginTransaction(this IDbConnection dbConnection,ICapPublisher publisher, bool autoCommit  false) {if (dbConnection.State  ConnectionState.Closed){dbConnection.Open();}var dbTransaction  dbConnection.BeginTransaction();publisher.Transaction.Value  publisher.ServiceProvider.GetServiceICapTransaction();return publisher.Transaction.Value.Begin(dbTransaction, autoCommit); } autoCommit:false此属性会自动提交事务集成其他ORM不建议开启因为我们只要调用 了Publish他会调用MySqlCapTransaction中的Commit(),并执行Flush即消息 会发出去。IDbContextTransaction这段代码是非常 重要的。    publisher.Transaction.Value  publisher.ServiceProvider.GetServiceICapTransaction(); 从CapPublisher中可以看出事务是通过AsyncLocal实现状态共享的。internal class CapPublisher : ICapPublisher {public AsyncLocalICapTransaction Transaction { get; } } publisher.Transaction.Value的类型实现上才是ICapTransaction CapTransactionExtensions.cs还有一个扩展方法调用Begin相当于给当前控制器上注入的ICapPublisher设置了new MySqlConnection(AppDbContext.ConnectionString).BeginTransaction()的值。      public static ICapTransaction Begin(this ICapTransaction transaction,IDbTransaction dbTransaction, bool autoCommit  false){transaction.DbTransaction  dbTransaction;transaction.AutoCommit  autoCommit;return transaction;} 对于ADO.NET我们只要传递transaction,就能保证发送消息和操作DB是一个事务了。。EF Core事务同样我们看扩展方法和使用方式    public static IDbContextTransaction BeginTransaction(this DatabaseFacade database,ICapPublisher publisher, bool autoCommit  false){var trans  database.BeginTransaction();publisher.Transaction.Value  publisher.ServiceProvider.GetServiceICapTransaction();var capTrans  publisher.Transaction.Value.Begin(trans, autoCommit);return new CapEFDbTransaction(capTrans);} dbContext.Database就是DatabaseFacade类型。直接能BeginTransaction事务。[Route(~/ef/transaction)] public IActionResult EntityFrameworkWithTransaction([FromServices]AppDbContext dbContext) {using (var trans  dbContext.Database.BeginTransaction(_capBus, autoCommit: false)){dbContext.Persons.Add(new Person() { Name  ef.transaction });for (int i  0; i  1; i){_capBus.Publish(sample.rabbitmq.mysql, DateTime.Now);}dbContext.SaveChanges();trans.Commit();}return Ok(); } 同样还有一个Begin扩展方法,仅仅是给ICapTransaction赋下值。public static ICapTransaction Begin(this ICapTransaction transaction,IDbContextTransaction dbTransaction, bool autoCommit  false) {transaction.DbTransaction  dbTransaction;transaction.AutoCommit  autoCommit;return transaction; }在这个demo上autoCommit是false,因为dbContext有自己的SaveChanges()如果发送不太合适。SaveChanges()要做好些操作具体不太情况是什么。具体不详细研究。但我们可以看下CapTransactionBase源码,DbTransaction是Object类型。EF Core中的事务类型是IDbContextTransactionADO.NET实际是IDbTransaction类型。 public object DbTransaction { get; set; } 所以在最开始的那段代码,判断DbTransaction是哪种类型然后调用自身内部使用的事务进行Commit()。如果要集成其他ORM但又想去掉EFCore的依赖,然后增加其他ORM如下类似的处理就是关键比如CommitAsyncCommit,Roolback()    public override void Commit(){Debug.Assert(DbTransaction ! null);switch (DbTransaction){case IDbTransaction dbTransaction:dbTransaction.Commit();break;case IDbContextTransaction dbContextTransaction:dbContextTransaction.Commit();break;}Flush();} 还有MySqlDataStorage.cshttps://github.com/dotnetcore/CAP/blob/master/src/DotNetCore.CAP.MySql/IDataStorage.MySql.cs判断dbTransaction的类型然后获取当前事务引用其他ORM记得修改此处。    var dbTrans  dbTransaction as IDbTransaction;if (dbTrans  null  dbTransaction is IDbContextTransaction dbContextTrans){dbTrans  dbContextTrans.GetDbTransaction();}参考项目不打算维护https://github.com/luoyunchong/DotNetCore.CAP.Provider维护就要保证与上层Dotnetcore/cap项目保持同步这是一件困难的事。还有一个重要的原因是我们有更简单的方式。FreeSql接入CAP(最简单的方式)关于此问题的想法https://github.com/luoyunchong/DotNetCore.CAP.Provider/issues/1我们还是引用各自官方的库Install-Package DotNetCore.CAP.Dashboard Install-Package DotNetCore.CAP.MySql Install-Package DotNetCore.CAP.RabbitMQ Install-Package FreeSql Install-Package FreeSql.DbContext Install-Package FreeSql.Provider.MySqlConnector 关于CAP集成的方式配置项这里不做详情官方地址有中文http://cap.dotnetcore.xyz/代码参考。因为只有一个类我们自行复制项目即可。https://github.com/luoyunchong/lin-cms-dotnetcore/blob/master/src/LinCms.Application/CapUnitOfWorkExtensions.cs重写扩展方法BeginTransaction。是基于IUnitOfWork的扩展。提交事务调用Commit(IUnitOfWork)时内部再通过反射调用 ICapTransaction中protected类型的方法Flush。 public static class CapUnitOfWorkExtensions{public static void Flush(this ICapTransaction capTransaction){capTransaction?.GetType().GetMethod(Flush, BindingFlags.Instance | BindingFlags.NonPublic)?.Invoke(capTransaction, null);}public static ICapTransaction BeginTransaction(this IUnitOfWork unitOfWork, ICapPublisher publisher, bool autoCommit false){publisher.Transaction.Value (ICapTransaction)publisher.ServiceProvider.GetService(typeof(ICapTransaction));return publisher.Transaction.Value.Begin(unitOfWork.GetOrBeginTransaction(), autoCommit);}public static void Commit(this ICapTransaction capTransaction, IUnitOfWork unitOfWork){unitOfWork.Commit();capTransaction.Flush();}} 注入我们的FreeSqlpublic void ConfigureServices(IServiceCollection services){IConfigurationSection configurationSection  Configuration.GetSection($ConnectionStrings:MySql);IFreeSql fsql  new FreeSqlBuilder().UseConnectionString(DataType.MySql, configurationSection.Value);.UseNameConvert(NameConvertType.PascalCaseToUnderscoreWithLower).UseAutoSyncStructure(true).UseNoneCommandParameter(true).UseMonitorCommand(cmd {Trace.WriteLine(cmd.CommandText  ;);}).Build();services.AddSingleton(fsql);services.AddFreeRepository();services.AddScopedUnitOfWorkManager(); } 示例    [HttpGet(~/freesql/unitofwork/{id})]public DateTime UnitOfWorkManagerTransaction(int id, [FromServices] IBaseRepositoryBook repo){DateTime now  DateTime.Now;using (IUnitOfWork uow  _unitOfWorkManager.Begin()){ICapTransaction trans  _unitOfWorkManager.Current.BeginTransaction(_capBus, false);repo.Insert(new Book(){Author  luoyunchong,Summary  2,Title  122});_capBus.Publish(freesql.time, now);trans.Commit(uow);}return now;}[NonAction][CapSubscribe(freesql.time)]public void GetTime(DateTime time){Console.WriteLine($time:{time});} 注意trans不需要usingfreesql内部会释放资源。也可using但请更新到最新的freesql版本。ICapTransaction trans  _unitOfWorkManager.Current.BeginTransaction(_capBus, false); 提交事务也请调用扩展方法否则事务无法正常。trans.Commit(uow); 源码位置https://github.com/luoyunchong/lin-cms-dotnetcore/blob/master/src/LinCms.Web/Controllers/v1/TestController.cs
http://wiki.neutronadmin.com/news/327836/

相关文章:

  • 网站怎么做施工企业环保应急预案
  • 三合一网站建设哪个好人像摄影网站
  • 旅行社的网站建设网页版qq农场登录入口
  • 网站建设 套格式做护肤的网站有哪些
  • 中成网站建设网站开发新闻管理系统的背景
  • 郑州网站关键手机网站建设的费用
  • 太平阳电脑网网站模板深圳做兼职的网站设计
  • 做优惠券网站如何引流30岁做网站编辑
  • flash个人音乐网站模板源码阿里巴巴开通诚信通后网站怎么做
  • 网站一般宽度临沂小程序开发公司哪家好
  • 如何让自己的网站被搜索引擎收录全网引流推广 价格
  • 免费静态网站托管平台南宁建站模板厂家
  • 有关企业电子网站建设论文安徽建设网官方网站
  • 北京做兼职网站有哪些北京设计公司有哪些公司
  • 网站建设商城制作怎么提高网站响应速度
  • 惠州市两学一做网站嘉定网站建设公司
  • 网站能实现什么功能做网站找个人还是公司
  • 汕头企业制作网站推广合肥 中网站
  • 网站建设与维护1997年WordPress系统配置要求
  • 做网站的域名是做什么用的荥阳做公司网站的公司
  • 惠州市网站建设公司免费软件电视剧最全
  • 网站单页支付宝支付怎么做怎样申请微信小程序开店
  • 网站的设计与制作论文题目温州市网站建设哪家公司好
  • iis网站子目录设置二级域名可以做设计私单的网站
  • 直播间挂人气自助网站网站被抄袭
  • 番禺建设网站哪家好4399游戏官网
  • 东莞做网站 自媒体网站建设案例 算命网站
  • 北京市网站制作郑州做网站哪家比较好
  • 菏泽科技网站建设购物网站开发环境
  • 网站模板 北京公司企业网站建设需要哪些软件