2

Я пытаюсь создать настраиваемый атрибут авторизации для моего проекта WebApi.Атрибут авторизации простого инжектора webapi

В этом атрибуте я хотел бы ввести объект IAuthModule. Я понятия не имею, как это реализовать. Я нашел некоторые решения в Интернете, но я не добился успеха ни с одним из них.

Это то, что я до сих пор:

public void Configuration(IAppBuilder app) 
{ 
    // WebApi config 
    HttpConfiguration config = new HttpConfiguration(); 

    // SimpleInjector 
    var container = new SimpleInjector.Container(); 

    container.Register<IAuthModule, CoreAuthModule>(); 

    container.RegisterWebApiFilterProvider(config); 
    container.RegisterWebApiControllers(config); 

    container.Verify(); 

    config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); 

    // Setup Oauth 
    ConfigureOAuth(app, container.GetInstance<IAuthModule>()); 

    WebApiConfig.Register(config); 

    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 
    app.UseWebApi(config); 
} 

и атрибут:

public class CustomAuthorizationAttribute : AuthorizeAttribute 
{ 
    // how can I inject something here? 
    public IAuthModule AuthModule { get; set; } 

    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     return false; 
    } 
} 

ответ

8

Simple Injector Web API integration guide переходит в более подробно об этом в разделе Injecting dependencies into Web API filter attributes. То, что он в основном описывает то, что вам нужно сделать две вещи:

  1. Использование метода RegisterWebApiFilterProvider расширения, чтобы позволить простой Инжектор для наращивания атрибутов Web API.
  2. Зарегистрируйте пользователя IPropertySelectionBehavior, чтобы убедиться, что Simple Injector будет вставлять зависимости в свойства вашего атрибута.

Так что это в основном сводится к добавлению следующей регистрации:

var container = new Container(); 

container.Options.PropertySelectionBehavior = new ImportPropertySelectionBehavior(); 

container.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 

Если ImportPropertySelectionBehavior реализуется следующим образом:

using System; 
using System.ComponentModel.Composition; 
using System.Linq; 
using System.Reflection; 
using SimpleInjector.Advanced; 

class ImportPropertySelectionBehavior : IPropertySelectionBehavior { 
    public bool SelectProperty(Type type, PropertyInfo prop) { 
     return prop.GetCustomAttributes(typeof(ImportAttribute)).Any(); 
    } 
} 

Этот обычай IPropertySelectionBehavior позволяет инъекции явное свойство, где отмечены свойства с атрибутом System.ComponentModel.Composition.ImportAttribute. Любое свойство, помеченное этим атрибутом, будет введено.

Обратите внимание, что инъекция зависимостей в атрибутах является оптимальной, как описано here и here.

+1

В новой версии Simple Injector нет 'RegisterWebApiFilterProvider' метода. – Chandermani

+0

@Steven есть альтернатива 'RegisterWebApiFilterProvider' в SimpleInjector 4? * Редактировать * @Chandermani нашел это: https://simpleinjector.readthedocs.io/en/latest/webapiintegration.html#injecting-dependencies-into-web-api-filter-attributes В основном просто используйте шаблон локатора сервисов (анти) , – GFoley83

Смежные вопросы