自定义AuthorizeAttribute Ninject属性注入不起作用(注入属性具有需要注入的子依赖服务)

时间:2015-04-30 15:20:52

标签: c# asp.net-mvc-4 dependency-injection ninject.web.mvc

我认为我的问题的细节与其他类似的问题非常不同。

我知道当我有自定义AuthorizeAttribute时,我无法使用构造函数注入依赖项。这是因为构造函数将采用参数 - 在我的例子中是权限字符串。

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

我依赖于授权服务,这就是我使用属性注入注入的原因。

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

问题在于此服务依赖于另一个服务 - 直接与存储库和dbcontext对话的用户服务。 我已指定我的db上下文生活在请求范围内。 这是一个例外 - “由于已经处理了DbContext,因此无法完成操作。” 当我查看代码时,当自动化服务调用usersservice时会发生这种情况,这会向dbcontext询问某些数据。 我该如何避免这种情况发生?

  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
            )
        {

1 个答案:

答案 0 :(得分:0)

史蒂文,感谢您的支持,我正在查看您建议的文章和Ninject手册。我完全同意你的说法,Property Binding并不是一个好主意。但无法理解为什么我们正在做文章中的所有事情(https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=98)。我想这是在Ninject作者添加了一种使用框架(https://github.com/ninject/Ninject.Web.Mvc/wiki/Filter-configurations)配置属性绑定的方法之前编写的。

我看了一下我的Ninject配置。对于我的授权过滤器,我有类似的东西:

#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

我有几个,然后灯泡时刻来了:)我刚看到配置中的一个小错误。而不是使用:

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 - &gt; WhenControllerHas

奇迹般地修复了一切。现在效果很好,代码看起来很好,没有额外的编码更改。