自定义AuthorizeAttribute Ninject物业注射不起作用(注入属性有哪些需要被注入子相关的服务) [英] Custom AuthorizeAttribute Ninject Property Injection doesn't work (injected property have sub dependant services which need to be injected)

查看:382
本文介绍了自定义AuthorizeAttribute Ninject物业注射不起作用(注入属性有哪些需要被注入子相关的服务)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想我的问题的细节比我有红色的其他类似的问题有很大的区别。

I think the specifics of my question are very much different than the other similar questions which I have red.

我知道,当我有自定义AuthorizeAttribute我可以' ŧ依赖注入的构造函数。这是因为构造将采取的参数 - 在我的情况下允许串

I know that when I have custom AuthorizeAttribute I can't inject dependencies with the constructor. This is because the constructor will take the parameters - in my case the permission strings.

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class UserAllCSPermissionBasedAuthFilter : AuthorizeAttribute
    {

我根据授权服务,这就是为什么我注射,使用属性注入。

I am depending on authorization service, that's why I am injected that using property injection.

[Inject]
  public IAuthorizationService _authorizationService { get; set; }

的问题是,该服务依赖于其他服务 - userservice它与资源库和的DbContext直接会谈。
我指定我住在请求范围分贝范围内。
这是cousing一个例外 - 因为的DbContext已被释放的操作无法完成。
当我看着代码时autorization服务调用userservice,询问一些数据的DbContext这种情况正在发生。
我应该如何避免这种情况的发生。

The problem is that this service depends on another service - userservice which talks directly with repository and dbcontext. I have specify for my db context to live in request scope. This is cousing an exception - "The operation cannot be completed because the DbContext has been disposed." When I looked at the code this is happening when the autorization service calls userservice which asks the dbcontext for some data. How should I avoid this happening?

  public class AuthorizationService : IAuthorizationService
    {
        private readonly ICommonRepository _commonRepository;
        private readonly IRepositoryBase<UsersInRolesEntity> _repositoryUsersInRoles;
        private readonly IRepositoryBase<UserCustomerRolesEntity> _repositoryCurstomerRoleEntities;
        private readonly ISqlCustomersRepository _sqlCustomerRepository;
        private readonly IRoleService _roleService;
        private readonly IUserService _userService;
        private readonly IPermissionService _permissionService;

        public AuthorizationService(
            IRepositoryBase<UsersInRolesEntity> repositoryUsersInRoles,
            IRepositoryBase<UserCustomerRolesEntity> repositoryCurstomerRoleEntities,
            ICommonRepository commonRepository,
            ISqlCustomersRepository sqlCustomerRepository,
            IRoleService roleService,
            IUserService userService,
            IPermissionService permissionService
            )
        {


推荐答案

史蒂芬,感谢支持,我一直在寻找你建议的文章和Ninject手册。我完全同意你的属性绑定是不是一个不错的主意。但不能让我们为什么(做所有的事情文章中的 https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=98 )。我想前Ninject作者增加了一个方法来配置属性,使用他们的框架(绑定写的 https://github.com/ninject/Ninject.Web.Mvc/wiki/Filter-configurations )。

Steven, thanks for the support, I was looking at the articles you suggested and the Ninject manual. I totally agree with you that Property Binding is not a nice idea. But couldn't get why we are doing all of the things in the article (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=98). I suppose that was written before the Ninject authors added a way to configure attribute binding using their framework (https://github.com/ninject/Ninject.Web.Mvc/wiki/Filter-configurations).

我看看我Ninject配置。对于我的授权过滤器我有这样的事情:

I had a look at my Ninject configuration. For my authorization filters I had something like this:

#region UserAllCSPermissionBasedAuthFilter

kernel.BindFilter<UserAllCSPermissionBasedAuthFilter>(FilterScope.Action, 0)
    .WhenActionMethodHas<UserAllCSPermissionBasedAuthFilter>()
    .WithConstructorArgumentFromActionAttribute<UserAllCSPermissionBasedAuthFilter>("permissionEnums", att => att.PermissionEnums);

kernel.BindFilter<UserAllCSPermissionBasedAuthFilter>(FilterScope.Controller, 0)
    .WhenActionMethodHas<UserAllCSPermissionBasedAuthFilter>()
    .WithConstructorArgumentFromControllerAttribute<UserAllCSPermissionBasedAuthFilter>("permissionEnums", att => att.PermissionEnums);

#endregion



我有一对夫妇的这些,然后光灯泡的时刻到来了:)我刚才看到在我的配置一个小失误。而不是使用的:

I have a couple of these and then the light-bulb moment came :) I just saw a small mistake in my configuration. Instead of using:

kernel.BindFilter<UserAllCSPermissionBasedAuthFilter>(FilterScope.Controller, 0)
    .WhenActionMethodHas<UserAllCSPermissionBasedAuthFilter>()
    .WithConstructorArgumentFromControllerAttribute<UserAllCSPermissionBasedAuthFilter>("permissionEnums", att => att.PermissionEnums);

这实际上应该是:

kernel.BindFilter<UserAllCSPermissionBasedAuthFilter>(FilterScope.Controller, 0)
    .WhenControllerHas<UserAllCSPermissionBasedAuthFilter>()
    .WithConstructorArgumentFromControllerAttribute<UserAllCSPermissionBasedAuthFilter>("permissionEnums", att => att.PermissionEnums);



WhenActionMethodHas - 。> WhenControllerHas

这奇迹般的一切问题。现在完美的作品,代码看起来好像没什么问题,无需额外的编码变化。

That miraculously fixed everything. Now works perfectly and the code looks fine to me without additional coding changes.

这篇关于自定义AuthorizeAttribute Ninject物业注射不起作用(注入属性有哪些需要被注入子相关的服务)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆