Я использую Autofac для ввода всех зависимостей моего проекта, который отлично работает. Теперь я добавил атрибут Custom Authorization (мне не нужны очень сложные функции, такие как OWIN и Identity). У пользовательского атрибута авторизации есть зависимость от уровня данных, поэтому я пытаюсь внедрить его как инъекцию свойств. Однако свойство всегда равно Null. Код ниже:Asp.Net Web Api и Autofac с выдачей атрибута пользовательского авторизации (свойство injection)
public class CustomAuthorizationFilterAttribute : AuthorizeAttribute, IAutofacAuthorizationFilter
{
public IAuthorisationHelper AuthorisationHelper { get; set; }
public override void OnAuthorization(HttpActionContext actionContext)
{
**... removed for brevity**
**// TODO: this should be injected by autofac and is always null??**
if (AuthorisationHelper.IsValidUser(username, password, out roleOfUser))
{
var principal =
new GenericPrincipal((new GenericIdentity(username)),
(new[] { roleOfUser }));
Thread.CurrentPrincipal = principal;
return;
}
... removed for brevity
}
}
Код, который впрыскивает AuthorizationHelper:
public static IContainer Container()
{
var builder = new ContainerBuilder();
var assemblies = new List<Assembly>();
assemblies.Add(Assembly.Load("Kids.Math.Interfaces"));
assemblies.Add(Assembly.Load("Kids.Math.Data"));
assemblies.Add(Assembly.Load("Kids.Math.Business"));
assemblies.Add(Assembly.Load("Kids.Math.ImportExport"));
assemblies.Add(Assembly.Load("Kids.Math.Common"));
assemblies.Add(Assembly.Load("Kids.Math.Api"));
builder.RegisterAssemblyTypes(assemblies.ToArray()).
AsImplementedInterfaces();
builder.RegisterType(typeof(MathContext)).As(typeof (DbContext)).InstancePerRequest();
// Register web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// TODO: this is not working, also this should be generic to register it for all controllers
// inject the authorisation filter
builder.RegisterType<AuthorisationHelper>().As<IAuthorisationHelper>();
builder.Register(c => new CustomAuthorizationFilterAttribute()).PropertiesAutowired()
.AsWebApiAuthorizationFilterFor<QuestionsImportController>()
.InstancePerRequest();
// Set the dependency resolver to be Autofac.
var container = builder.Build();
return container;
}
Атрибут зарегистрирован в FilterConfig в filters.Add (новый CustomAuthorizationFilterAttribute());
Все проводки, но AuthorisationHelper всегда равно нулю.
Любые комментарии будут оценены.
Я делаю это. Как вы можете видеть, указанная выше функция возвращает контейнер, а затем я использую его как: var container = WebApiAutofacContainer.Container(); config.DependencyResolver = новый AutofacWebApiDependencyResolver (контейнер); .... без этого ничего не сработает !!! Как я уже упоминал, все остальное работает, кроме этой инъекции свойств! – user1829319
Я отредактировал свой ответ. Я не хотел предполагать, что вы делали с контейнером, поэтому я хотел убедиться, что вы правильно его зарегистрировали :) – Ruskin
Привет, Раскин, спасибо вашему ответу. Я попробовал ваше предложение, но все равно не повезло. Недвижимость до сих пор Null. – user1829319