0

我正在使用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

4

0 回答 0