2017-05-10 28 views
3

私はMVCアプリケーションでカスタム認証フィルタを設定しようとしていますが、認証フィルタのユーザサービスへの参照が必要です。そのようなUnityと私のセットアップは私のサービス:Unityからインターフェイスのインスタンスを取得する

private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() => 
    { 
     var container = new UnityContainer(); 
     RegisterTypes(container); 
     return container; 
    }); 

    public static IUnityContainer GetConfiguredContainer() 
    { 
     return container.Value; 
    } 

    public static void RegisterTypes(IUnityContainer container) 
    { 

     // container.LoadConfiguration(); 

     // TODO: Register your types here 
     container.RegisterType<IUserService, UserService>(); 

    } 

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(GERPWeb.App_Start.UnityWebActivator), "Start")] 
[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(GERPWeb.App_Start.UnityWebActivator), "Shutdown")] 

namespace APP.App_Start 
{ 
/// <summary>Provides the bootstrapping for integrating Unity with ASP.NET MVC.</summary> 
public static class UnityWebActivator 
{ 
    /// <summary>Integrates Unity when the application starts.</summary> 
    public static void Start() 
    { 
     var container = UnityConfig.GetConfiguredContainer(); 

     FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First()); 
     FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container)); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

     // TODO: Uncomment if you want to use PerRequestLifetimeManager 
     // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule)); 
    } 

    /// <summary>Disposes the Unity container when the application is shut down.</summary> 
    public static void Shutdown() 
    { 
     var container = UnityConfig.GetConfiguredContainer(); 
     container.Dispose(); 
    } 
} 

これがそうのように、私はコンストラクタを持つことができることをどこでも正常に動作します:

:私は私の認証フィルタで1を持つことはできませんしかし

public class UserController : BaseController 
{ 

    private readonly IUserService _userService; 

    public CustomerController(IUserService userService) 
    { 
     _userService = userService; 

    } 

私FilterConfig.csで次に

public class BasicAuthorization : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     //see if we can skip the authorization 
     bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) || 
           filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
            typeof(AllowAnonymousAttribute), true); 

     if (!skipAuthorization) 
     { 
      //var userService = ServiceLocator.Current.GetInstance<IUserService>(); 
      //get instance of user service here 


      base.OnAuthorization(filterContext); 
     } 
    } 
} 

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new BasicAuthorization()); 
     filters.Add(new HandleErrorAttribute()); 
    } 

サービスロケータと呼ばれるものへの参照を見つけ、自分の能力を最大限引き出そうとしましたが、その行にServiceLocationProvider must be set.という文字列があり、すべてのGoogleリンクがWPF用です。

私はここで何が欠けていますか?

答えて

2

すでにサービスロケータパターンに従っているDependencyResolverを既に設定しています。

public class BasicAuthorization : AuthorizeAttribute { 
    public override void OnAuthorization(AuthorizationContext filterContext) { 
     //see if we can skip the authorization 
     bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) || 
           filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
            typeof(AllowAnonymousAttribute), true); 

     if (!skipAuthorization) { 
      //Using dependency resolver here 
      var userService = (IUserService) DependencyResolver.Current.GetService(typeof(IUserService)); 


      base.OnAuthorization(filterContext); 
     } 
    } 
} 

あなたは

var userService = DependencyResolver.Current.GetService<IUserService>(); 
を可能にするインスタンス

public static T GetService<T>(this IDependencyResolver container) { 
    return (T)container.GetService(typeof(T)); 
} 

のクリーン解像度を可能にする拡張メソッドを作成することができます

関連する問題