【发布时间】:2018-06-23 14:57:16
【问题描述】:
我目前写了一个拦截器,代码如下
public class TransactionalInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
using (var transaction = ...)
{
try
{
invocation.Proceed();
transaction.Commit();
}
catch
{
transaction.Rollback();
}
finally
{
transaction.Dispose();
}
}
}
}
但是当注册这个拦截器时,它将适用于所有方法。我有一个服务类,其存储库注入了 CRUD 方法。 我不希望为查询方法打开事务。
我阅读了这个链接,但我不知道如何将它应用到我的代码中 http://docs.autofac.org/en/latest/advanced/adapters-decorators.html#decorators
我不知道谁来重构我的 TransactionalInterceptor(并注册它)以在像这段代码这样的类中使用它
[Intercept(typeof(LoggerInterceptor))] //logger
public class SomeService : ISomeService
{
private readonly ISomeRepository someRepository;
public SomeService(SomeRepository someRepository)
{
this.someRepository = someRepository;
}
public IEnumerable<SomeDto> GetAll()
{
// code
}
public SomeDto GetById()
{
// code
}
[Transactional]
public int Create(SomeDto someDto)
{
// code to insert
}
}
【问题讨论】:
-
IIRC,只拦截
virtual方法。 -
@Amy 你几乎是对的。 Castle 有 2 种内部方法来进行拦截。一种用于
class,其中仅拦截virtual成员,另一种用于interface,其中将拦截接口的所有方法。在第一种情况下,将创建一个继承类,在另一种情况下,将创建一个实现接口的聚合类型。
标签: c# autofac castle-dynamicproxy