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用です。
私はここで何が欠けていますか?