-
Notifications
You must be signed in to change notification settings - Fork 857
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
UnitOfWork能不支持事务嵌套 #262
Comments
不知道你的项目类型,现在是如何传播事务对象的? 如果使用相同的事务,并且在使用 asp.net core,用 AddScoped 注入一下能解决吗? |
```csharp
//第一步:
public class UnitOfWorkRepository<TEntity, TKey> : BaseRepository<TEntity, TKey>
{
public UnitOfWorkRepository(IFreeSql fsql, IUnitOfWork uow) : base(fsql, null, null)
{
this.UnitOfWork = uow;
}
}
public class UnitOfWorkRepository<TEntity> : BaseRepository<TEntity, int>
{
public UnitOfWorkRepository(IFreeSql fsql, IUnitOfWork uow) : base(fsql, null, null)
{
this.UnitOfWork = uow;
}
}
//第二步:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IFreeSql>(fsql);
services.AddScoped<FreeSql.IUnitOfWork>(sp => fsql.CreateUnitOfWork());
services.AddScoped(typeof(IBaseRepository<>), typeof(UnitOfWorkRepository<>));
services.AddScoped(typeof(BaseRepository<>), typeof(UnitOfWorkRepository<>));
//批量注入程序集内的所有自建仓储类,可以根据自己需要来修改
Assembly[] assemblies = new [] { typeof(XxxRepository).Assembly };
if (assemblies?.Any() == true)
foreach (var asse in assemblies)
foreach (var repo in asse.GetTypes().Where(a => a.IsAbstract == false && typeof(UnitOfWorkRepository).IsAssignableFrom(a)))
services.AddScoped(repo);
}
|
包装一个 UnitOfWorkManager 类 class UnitOfWorkManager
{
int _counter;
IFreeSql _fsql;
public UnitOfWorkManager(IFreeSql fsql)
{
_counter = 0;
_fsql = fsql;
}
public IUnitOfWork UnitOfWork { get; private set; }
public void Begin()
{
if (_uow = null)
UnitOfWork = _fsql.CreateUnitOfWork();
_counter ++;
}
public void Rollback()
{
UnitOfWork.Rollback();
}
public void Commit()
{
if (--counter == 0)
UnitOfWork.Commit();
}
} |
主要看解决什么问题,上面两个方向即兴想的。UnitOfWorkManager可能比较扯。 还可以看看 Aop 能不能解决一些问题。 |
我自己已包装了一个,我想能不能框架就提供,就不用自己包装了^^ |
` public static class MyFreeSqlExtensions /// 创建基于仓储功能的工作单元,务必使用 using 包含使用 /// /// /// public static IMyRepositoryUnitOfWork CreateMyUnitOfWork(this IFreeSql that) { return new MyRepositoryUnitOfWork(that); } }
|
然后注入 |
只是框架能提供更好些,上面的代码只能简单的实现类似Spring的事务注解Supoort功能 |
new 重写的方法,不能再使用 BaseType 注入,不然没有效果 |
哦, 没有注意到! |
要这样弄主要有两个原因。 |
4、一些之前使用 JAVA Spring的成员经常这样用,结果当前是Bug一片片的。因此对要对UnitOfWork的事务提交模式进行一下修改。 |
了解,看是继承实现,或者用上面发的UnitOfWorkManager,都可以 |
FreeSql.UnitOfWork 默认要手工触发 Commit 提交事务。所以个人觉得用 UnitofworkManager 比较好控制一点,可以在他的 Disponse 内判断执行 Commit,防止 counter 计数器不准确时候的问题。 |
OK,我再多测试一下 |
好的,我试试看。 |
这个修改会在1.4版本发布吗? |
1.4预览版最新的有了,可以提前体验咯 1.4正式版,在这个月底发布 |
版本已发布 |
UnitOfWork能不能支持能事务嵌套,或者类似Spring中事务Support模式一样。多个方法都使用同一个UnitOfWork,并且都Commit,但只有最后一次是真正的提交到数据库。
The text was updated successfully, but these errors were encountered: