我认为我的问题的细节与其他类似的问题非常不同。
我知道当我有自定义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
)
{
答案 0 :(得分:0)
我看了一下我的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 强>
奇迹般地修复了一切。现在效果很好,代码看起来很好,没有额外的编码更改。