使用Ninject BindHttpFilter时的范围问题

问题描述 投票:5回答:1

我有一个WebApi服务,我正在尝试向使用Ninject BindHttpFilter添加身份验证。

使用BindHttpFilter可以将身份验证过滤器绑定到特定属性。 AuthenticationFilter采用构造函数参数(IAuthenticationService),该参数本身由Ninject创建。

kernel.BindHttpFilter<AuthenticationHttpFilter>(System.Web.Http.Filters.FilterScope.Action)
    .WhenActionMethodHas<AuthenticationFilterAttribute>()
    .WithConstructorArgument("service", x => x.Kernel.Get<IAuthenticationService>());

AuthenticationService的具体实现采用通过Ninject注入的构造函数参数INonceRepository:

public AuthenticationService(INonceRepository nonceRepository, ...)

NonceRepository的具体实现采用通过Ninject注入的构造函数ISession:

public NonceRepository(ISession session)

这是Ninject绑定的样子:

kernel.Bind<INonceRepository>().To<NonceRepository>();
kernel.Bind<IAuthenticationService>().To<AuthenticationService>()

var session = sessionFactory.OpenSession();

Bind<ISession>().ToMethod(c => session).InRequestScope();

当代码运行时,AuthenticationService的具体实现仅被实例化一次,因此NonceRepositiory仅被实例化一次。这意味着ISession有效并且打开了第一个请求,但是在第二次调用时关闭了ISession,并且从未第二次调用AuthenticationService的构造函数。似乎这是一个范围问题,但是我无法弄清楚没有正确的范围来使AuthenticationService根据请求重新创建。

我试图将BindHttpScope请求从FilterScope.Controller更改为FilterScope.Action(这种想法会导致AuthenticationService的范围是它是每个Action调用创建的,但并没有解决。)>

这是代码有趣的地方:

public class AuthenticationHttpFilter : IAuthenticationFilter
{
    private readonly IAuthenticationService authenticationService;

    public AuthenticationHttpFilter(IAuthenticationService service)
    {
        this.authenticationService = service;
    }

    public bool AllowMultiple { get; private set; }

    public Task AuthenticateAsync(HttpAuthenticationContext authenticationContext, CancellationToken cancellationToken)
    {
        authenticationService.DoAuth();
        return Task.FromResult(0);
    }

    public Task ChallengeAsync(HttpAuthenticationChallengeContext authenticationChallengeContext, CancellationToken cancellationToken)
    {
    ...
    }
}

public class AuthenticationService : IAuthenticationService
{
    private readonly INonceRepository nonceRepo;

    public AuthenticationService(INonceRepository nonceRepo){...}

    public void DoAuth()
    {
        this.nonceRepo.Add(...);
    }
}

public class NonceRepository : INonceRepository
{
    private readonly ISession _session;

    public NonceRepository(ISession session)
    {
        this._session = session;
    }

    public void Add(Nonce nonce)
    {
        this._session.Save(nonce);
    }
}

我有一个WebApi服务,我正在尝试向使用Ninject BindHttpFilter添加身份验证。使用BindHttpFilter可以将身份验证过滤器绑定到特定属性。 ...

ninject asp.net-web-api2
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.