我对这个问题MVC Custom ROles Provider具有类似的设置。我已经创建了自定义角色提供程序。但是我想像我的项目其余部分一样使用Unity IOC。我已经尝试为此实现服务定位器模式,并且我对这个概念非常陌生。我遵循的是Custom Roles Fine Print指南,这就是我遇到的问题。
这是我的WebConfig角色管理器部分
<roleManager enabled="true" defaultProvider="CustomRoleProvider"> <providers>
<clear />
<add name="CustomRoleProvider" type="Reconciliation.CustomRoleProvider" applicationName="/" /> </providers>
</roleManager>
我正在使用UnityMvcActivator启动类,如下所示。 Start()类在外部类库中。从我的UI项目中引用了它。设置了我的依赖注入
using CommonServiceLocator;
using System.Linq;
using System.Web.Mvc;
using Unity.AspNet.Mvc;
using Unity.ServiceLocation;
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(Bootstrapper.UnityMvcActivator), nameof(Bootstrapper.UnityMvcActivator.Start))]
[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(Bootstrapper.UnityMvcActivator), nameof(Bootstrapper.UnityMvcActivator.Shutdown))]
namespace Bootstrapper
{
/// <summary>
/// Provides the bootstrapping for integrating Unity with ASP.NET MVC.
/// </summary>
public static class UnityMvcActivator
{
/// <summary>
/// Integrates Unity when the application starts.
/// </summary>
public static void Start()
{
var locator = new UnityServiceLocator(UnityConfig.Container);
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(UnityConfig.Container));
DependencyResolver.SetResolver(new UnityDependencyResolver(UnityConfig.Container));
ServiceLocator.SetLocatorProvider(() => locator);
// TODO: Uncomment if you want to use PerRequestLifetimeManager
//Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
bool AlwasyTrue = ServiceLocator.IsLocationProviderSet;
}
/// <summary>
/// Disposes the Unity container when the application is shut down.
/// </summary>
public static void Shutdown()
{
UnityConfig.Container.Dispose();
}
}
}
var AlwasyTrue = ServiceLocator.IsLocationProviderSet;这里永远是真实的;
In my Custom Roles Provider Class I have
using System;
using System.Web.Security;
using Core.Interfaces;
using Unity.ServiceLocation; <--
public class CustomRoleProvider : RoleProvider
{
public override string[] GetRolesForUser(string username)
{
bool alwaysFalse = ServiceLocator.IsLocationProviderSet;
ICustomRoleProviderService roleService =
ServiceLocator.Current.GetInstance<ICustomRoleProviderService>();
return roleService.GetRolesForUser(username);
}
}
bool alwaysFalse = ServiceLocator.IsLocationProviderSet; <此处始终为false,始终在Unity Start()类之后调用。
我不太确定如何解决它。它说我需要设置服务位置提供者。我相信这个问题与外部课程中的Unity IOC有关。它适用于其他类中的DI,但不适用于RolesManager中的Dependency Resolver /服务定位器。
答案 0 :(得分:1)
已解决事实证明,问题实际上出在错误中。在我使用的外部UnityMvcActivator类中,
using CommonServiceLocator;
以及我正在使用的CustomRoleProvider类中
using Unity.ServiceLocation;
我最终改变了那个参考,并对其进行了重建,它可以按预期工作。花了一段时间找到这个。希望这对其他人有帮助。