我为我的问题寻找了很长时间的解决方案。我有一个自定义的AuthorizeAttribute,它需要依赖于一个可以访问DbContext的“Service”。不幸的是,依赖注入在自定义的AuthorizeAttribute中无法工作,并且总是为空。
我想到了一个(对我来说)可接受的解决方案。现在我想知道我的解决方案是否会导致意想不到的行为?
Global.asax.cs
CustomAuthorizeAttribute.AuthorizeServiceFactory = () => unityContainer.Resolve<AuthorizeService>();
CustomAuthorizeAttribute.cs
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public static Func<AuthorizeService> AuthorizeServiceFactory { get; set; }
public Privilege Privilege { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool authorized = base.AuthorizeCore(httpContext);
if (!authorized)
{
return false;
}
return AuthorizeServiceFactory().AuthorizeCore(httpContext, Privilege);
}
}
AuthorizeService.cs
public class AuthorizeService
{
[Dependency]
public UserService UserService { private get; set; }
public bool AuthorizeCore(HttpContextBase httpContext, Privilege privilege)
{
ApplicationUser user = UserService.FindByName(httpContext.User.Identity.Name);
return UserService.UserHasPrivilege(user.Id, privilege.ToString());
}
}
这是一种可接受的解决方案吗?在将来会遇到什么麻烦,或者也许有更好的方法来使用依赖注入在自定义的AuthorizeAttribute中吗?
Autofac
,他们提供了一种通过提供程序解决操作筛选器中依赖关系的方法。 https://autofaccn.readthedocs.io/en/latest/integration/mvc.html?highlight=filter#enable-property-injection-for-action-filters但是当我使用上面的提供程序时遇到的问题是,我的UserService
依赖于DbContext
,它会抛出一个错误,即 “因为DbContext已被释放,所以无法完成操作” 仅当我在让上一个请求完成之前点击浏览器刷新按钮时才会出现这个错误。 - Ammar Khan