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

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

我认为我的问题的具体细节与我标记为红色的其他类似问题有很大不同。

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

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

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

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

问题是这个服务依赖于另一个服务 - 直接与存储库和 dbcontext 对话的 userservice。 我已指定我的数据库上下文位于请求范围内。 这是一个异常 - “操作无法完成,因为 DbContext 已被释放。” 当我查看代码时,当授权服务调用 userservice 向 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
            )
        {

最佳答案

Steven,感谢您的支持,我正在查看您推荐的文章和 Ninject 手册。我完全同意你的观点,属性绑定(bind)不是一个好主意。但是无法理解为什么我们要执行文章中的所有操作 (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=98)。我想那是在 Ninject 作者添加一种使用他们的框架 (https://github.com/ninject/Ninject.Web.Mvc/wiki/Filter-configurations) 配置属性绑定(bind)的方法之前编写的。

我查看了我的 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 -> WhenControllerHas.

这奇迹般地修复了一切。现在可以完美运行,代码对我来说看起来很好,无需额外的编码更改。

关于c# - 自定义 AuthorizeAttribute Ninject 属性注入(inject)不起作用(注入(inject)的属性具有需要注入(inject)的子依赖服务),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29971605/

相关文章:

c# - 获取类中所有方法的属性列表

android - dagger 中的 DI 和泛型类

spring - 如何使用运行时 "qualifier"变量动态注入(inject)服务?

javascript - 从 Document.ready 中的包执行 javascript

c# - 如何显示 tiff 图像?

c# - Dummies 的控制反转(IoC/依赖注入(inject))

c# - 代码没有错误,但是从数据库中检索到的数据没有显示在列表框中

c# - 单选按钮选定的值未传递到 Controller

c# - 在 C# Winform 应用程序中设置 DataGridView 行背景图像

javascript - 模型绑定(bind)器未拾取表单编码的 Javascript int []