我正在使用InterceptAttribute ( Ninject.Extensions.Interception.Attributes ) 代理我的服务类并在执行方法之前添加一些额外的功能。
例如:
public class ServiceExample : IServiceExample
{
private readonly IDao dao;
public ServiceExample(IDao dao)
{
this.dao = dao;
}
[Transaction]
public virtual void Save()
{
dao.Increment();
}
}
public sealed class TransactionAttribute : InterceptAttribute
{
public override IInterceptor CreateInterceptor(IProxyRequest request)
{
// request.Kernel.GetHashCode() != del kernel utilizado en la WebApi ==> kernel.BeginBlock().GetHashCode()
return request.Kernel.Get<TransactionInterceptor>();
}
}
public class TransactionInterceptor : IInterceptor
{
private readonly IDao dao;
public TransactionInterceptor(IDao dao)
{
this.dao = dao;
}
public void Intercept(IInvocation invocation)
{
dao.Increment();
invocation.Proceed();
}
}
我希望dao.Increment()每个请求执行两次。但是当我检查它时,它只会触发一次。这是因为服务和拦截器使用的是不同的IDao实例。
我正在使用这种方法来配置请求范围绑定:
kernel.Bind<IDao>().To<Dao>().InScope(
context =>
{
if (context == null)
{
return null;
}
var scope = context.Kernel.Components
.GetAll<INinjectHttpApplicationPlugin>()
.Select(c => c.GetRequestScope(context))
.FirstOrDefault(s => s != null);
return scope;
});
使用 ASP NET MVC 控制器,这工作得很好。但是当我迁移到 WebApi (ApiController) 时,它按预期停止了工作。
希望有人可以帮助我。我给你一个带有单元测试的示例项目的链接:https ://github.com/hlavrencic/Ninject.Extensions.Interception.WebApiFix/tree/bug/Investigacion.Web.Test