12

ile özel Web API eylem filtresi özniteliğine bağımlılıkları enjekte etme Bir MVC4 uygulamasında API denetleyicileri süslemek için kullandığım özel AuthorizeAttribute bağımlılarımın çözümlerini çözmeye çalışıyorum. Sorun şu ki, özel filtremde kullandığım hizmet bağımlılığı üzerinde NullReferenceException almaya devam ediyorum.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; 
    } 
} 

ve benim özel yetki filtre: İşte benim Autofac yapılandırma

var builder = new ContainerBuilder(); 
builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 

Ama bu görünmüyor: tüm gereken official docs göre

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 
    } 
} 

olduğunu hile de yapın. Herhangi bir yardım için teşekkür ederiz.

+1

Ben _authenticationSvc bir özellik değil bir saha – MikeSW

+1

@MikeSW Şimdi bana bu istisna verir olması gerektiğini düşünüyorum: 'Bir Etiket eşleşen 'AutofacWebRequest' ile hiçbir kapsamını kapsamından görünür olduğu Örnek istendi. Bu genellikle, HTTP'ye göre kaydedilen bir bileşenin bir SingleInstance() bileşeni (veya benzer bir senaryo) tarafından talep edildiğini belirtir. Web entegrasyonu altında her zaman bağımlılığın DependencyResolver.Current veya ILifetimeScopeProvider.RequestLifetime'dan istemini istemez. . –

cevap

18

Sen Ayrıntınız

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    public IAuthenticationSvc AuthenticationSvc { get; set; } 
} 

ve oluşturucu için mülkiyet enjeksiyonu yapılandırmanız gerekir @Toan Nguyen cevap ilaveten

builder.RegisterType<MyAuthorizeAttribute>().PropertiesAutowired(); 
9

, bu ...

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    public IAuthenticationSvc AuthenticationSvc { get; set; } 
} 
varsa

... Ayrıca aşağıdaki ilk hatta ihtiyacınız var (ya da gerekebilir):

builder.RegisterFilterProvider(); 
builder.RegisterType<MyAuthorizeAttribute>().PropertiesAutowired(); 

Referans: http://itprojectpool.blogspot.com.au/2014/03/autofac-di-on-action-filters.html

+1

Evet, bu ilk hat benim için düzeltdi. – Austin

+0

Peki, bu MVC için doğru mu? Sorudaki örnek kod, WebAPI kaydı içindir. Soru MVC için de etiketlenmiş olmasına rağmen, bu bilgi uygun, sadece olmalıdır RegisterFilterProvider yöntemi MVC eşdeğer olduğunu 'RegisterWebApiFilterProvider' bence –

7

Ben AutoFac belgelerine WebAPI eylem filtreleri için çok daha basit bir çözüm sunar düşünüyorum.

public interface ServiceCallActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
    // Get the request lifetime scope so you can resolve services. 
    var requestScope = actionContext.Request.GetDependencyScope(); 

    // Resolve the service you want to use. 
    var service = requestScope.GetService(typeof(IMyService)) as IMyService; 

    // Do the rest of the work in the filter. 
    service.DoWork(); 
    } 
} 

O "saf DI" o hizmet bulucu kullanarak gibi, değil ama basit ve istek kapsamı ile çalışır. Her bir WebApi denetleyicisi için belirli eylem filtresi kaydetme konusunda endişelenmenize gerek yoktur.

Kaynak: http://autofac.readthedocs.io/en/latest/integration/webapi.html#provide-filters-via-dependency-injection