使用Autofac将依赖项注入到自定义Web API操作过滤器属性中 [英] Injecting dependencies into custom Web API action filter attribute with Autofac
本文介绍了使用Autofac将依赖项注入到自定义Web API操作过滤器属性中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试解决自定义AuthorizeAttribute
的依赖关系,该自定义AuthorizeAttribute
用来装饰MVC4应用程序中的API控制器.问题是,在自定义过滤器中使用的服务依赖项上始终显示NullReferenceException
.这是我的Autofac配置:
I'm trying to resolve the dependencies of my custom AuthorizeAttribute
which I use to decorate my API controllers in an MVC4 app. Problem is that I keep getting a NullReferenceException
on the service dependency I use within my custom filter. Here is my Autofac configuration:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerApiRequest();
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerApiRequest();
builder.RegisterAssemblyTypes(typeof(UserProfileRepository).Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces().InstancePerApiRequest();
builder.RegisterAssemblyTypes(typeof(IUserProfileMapper).Assembly)
.Where(t => t.Name.EndsWith("Mapper"))
.AsImplementedInterfaces().InstancePerApiRequest();
builder.RegisterAssemblyTypes(typeof(UserProfileSvc).Assembly)
.Where(t => t.Name.EndsWith("Svc"))
.AsImplementedInterfaces().InstancePerApiRequest();
builder.RegisterWebApiFilterProvider(config);
var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
config.DependencyResolver = resolver;
}
}
和我的自定义授权过滤器:
and my custom authorize filter:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
public IAuthenticationSvc _authenticationSvc;
protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (!base.IsAuthorized(actionContext))
{
return false;
}
var trueUserId = WebSecurity.CurrentUserId;
if (_authenticationSvc.GetUsersRoles(trueUserId).Any(x => x == "Admin")) return true;
// NullReferenceException on _authenticationSvc
}
}
根据官方文档,所有需要的是:
var builder = new ContainerBuilder();
builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
但是,这似乎也不能解决问题.感谢任何帮助.
But that doesn't seem to do the trick either. Appreciate any help.
推荐答案
您应该为属性配置属性注入
You should configure property injection for your attribute
public class MyAuthorizeAttribute : AuthorizeAttribute
{
public IAuthenticationSvc AuthenticationSvc { get; set; }
}
和建造者
builder.RegisterType<MyAuthorizeAttribute>().PropertiesAutowired();
这篇关于使用Autofac将依赖项注入到自定义Web API操作过滤器属性中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文