我只是好奇,在Java中,@Transactional可以在方法名称上方放置一个属性,并且由于几乎每个应用程序服务方法都使用事务,因此可以简化代码。
// Java example
public class FooApplicationService {
@Transactional
public void DoSomething()
{
// do something ...
}
}
Run Code Online (Sandbox Code Playgroud)
目前,这是在.NET中完成的方式
// .NET example
public class FooApplicationService {
public void DoSomething()
{
using (var transaction = new TransactionScope())
{
// do something ...
transaction.Complete();
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否也可以通过.NET Core中的注释属性来管理事务的?
您可以为此创建动作过滤器
//filter factory is used in order to create new filter instance per request
public class TransactionalAttribute : Attribute, IFilterFactory
{
//make sure filter marked as not reusable
public bool IsReusable => false;
public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
{
return new TransactionalFilter();
}
private class TransactionalFilter : IActionFilter
{
private TransactionScope _transactionScope;
public void OnActionExecuting(ActionExecutingContext context)
{
_transactionScope = new TransactionScope();
}
public void OnActionExecuted(ActionExecutedContext context)
{
//if no exception were thrown
if (context.Exception == null)
_transactionScope.Complete();
}
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用
public class HomeController : Controller {
//...
[Transactional]
public IActionResult Test() { /*some code */ }
//...
}
Run Code Online (Sandbox Code Playgroud)
注意
如@cmart的评论中所述,有一种更优雅的解决方案可以通过使用IAsyncActionFilter
public class TransactionalAttribute : Attribute, IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
using (var transactionScope = new TransactionScope())
{
await next();
transactionScope.Complete();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |