Tôi đang cố gắng giải quyết các phụ thuộc của tùy chỉnh AuthorizeAttribute
tùy chỉnh mà tôi sử dụng để trang trí bộ điều khiển API của mình trong ứng dụng MVC4. Vấn đề là tôi tiếp tục nhận được một NullReferenceException
về sự phụ thuộc dịch vụ mà tôi sử dụng trong bộ lọc tùy chỉnh của mình. Dưới đây là cấu hình của tôi Autofac:Tiêm phụ thuộc vào thuộc tính bộ lọc hành động API Web tùy chỉnh với Autofac
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;
}
}
và tùy chỉnh của tôi ủy quyền cho bộ lọc:
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
}
}
Theo official docs tất cả những gì cần thiết là:
var builder = new ContainerBuilder();
builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
Nhưng điều đó dường như không làm thủ thuật. Đánh giá cao bất kỳ trợ giúp nào.
Tôi nghĩ _authenticationSvc cần phải được một tài sản không phải là một lĩnh vực – MikeSW
@MikeSW Bây giờ nó mang lại cho tôi ngoại lệ này: 'Không phạm vi với một Tag khớp 'AutofacWebRequest' có thể nhìn thấy từ phạm vi trong đó đã được yêu cầu. Điều này thường chỉ ra rằng một thành phần được đăng ký theo yêu cầu trên HTTP đang được yêu cầu bởi một thành phần SingleInstance() (hoặc một kịch bản tương tự.) Theo tích hợp web luôn yêu cầu các phụ thuộc từ DependencyResolver.Current hoặc ILifetimeScopeProvider.RequestLifetime, không bao giờ từ chính vùng chứa đó .' –