У меня есть аналогичная настройка на этот вопрос MVC Custom ROles Provider .Я создал свой поставщик ролей.но я хотел бы использовать Unity IOC, как и весь мой проект.Я попытался реализовать шаблон Service Locator для этого, и я очень новичок в этой концепции.Я следовал этому руководству Custom Roles Fine Print и вот где я застрял.
Вот мой раздел менеджера ролей WebConfig
<roleManager enabled="true" defaultProvider="CustomRoleProvider"> <providers>
<clear />
<add name="CustomRoleProvider" type="Reconciliation.CustomRoleProvider" applicationName="/" /> </providers>
</roleManager>
Я использую класс запуска UnityMvcActivator следующим образом.Класс Start () находится во внешней библиотеке классов.и на него есть ссылки из моего проекта пользовательского интерфейса.Это настроило мою инъекцию зависимостей
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 ().</p>
Но выдает ошибку
Я не совсем уверен, как это исправить.Это говорит о том, что мне нужно установить поставщика услуг.Я считаю, что проблема как-то связана с тем, что МОК из Unity находится во внешнем классе.Он работает для DI в других классах, но не для Dependency Resolver / service locator в RolesManager ... Stumped .... Любая помощь, пожалуйста.