自定义AuthorizeAttribute Ninject物业注射不起作用(注入属性有哪些需要被注入子相关的服务) [英] Custom AuthorizeAttribute Ninject Property Injection doesn't work (injected property have sub dependant services which need to be injected)
问题描述
我想我的问题的细节比我有红色的其他类似的问题有很大的区别。
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屋!