2015-02-02 2 views
0

Я делаю тесты для некоторых действий моего контроллера в WebAPI. Я пытаюсь настроить Autofac, так что это будет универсальная область с настройками для каждого теста.Зарегистрировать действие по активации для каждого ApiController

Каждый раз, когда запрашивается ApiController из Autofac Я хочу, например, создать свойство ClaimsIdentity, чтобы проверить подлинность пользователя.

Это, как я пытаюсь сделать это:

newBuilder.RegisterType<ApiController>().OnActivated(c => 
{ 
    var controller = c.Instance; 
    controller.Request = Message; 
    var identity = new ClaimsIdentity(); 
    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, UserId)); 
    controller.User = new ClaimsPrincipal(identity); 
}); 

newBuilder.Update(container); 

Однако это не работает. Если я заменил ApiController на любой фактический контроллер, тогда он будет работать.

Мои контроллеры зарегистрированы как это:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

ответ

0

Я на самом деле удалось сделать что-то, как я описал, хотя я не вполне доволен решением (но это работает).

// Get any controller from the namespace where all the controllers are 
var asm = Assembly.GetAssembly(typeof(UserController)); 

foreach (var type in asm.GetTypes()) 
{ 
    if (type.Namespace == "Namespace.With.Controllers" && type.IsSubclassOf(typeof(ApiController))) 
    { 
     newBuilder.RegisterType(type).OnActivated(c => 
     { 
      var controller = (ApiController)c.Instance; 
      controller.Request = Message; 
      var identity = new ClaimsIdentity(); 
      identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, UserId)); 
      controller.User = new ClaimsPrincipal(identity); 
     }); 
    } 
} 
Смежные вопросы