Шаблон настраиваемого поставщика ролей, Unity и сервисного локатора - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть аналогичная настройка на этот вопрос 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>

Но выдает ошибку enter image description here

Я не совсем уверен, как это исправить.Это говорит о том, что мне нужно установить поставщика услуг.Я считаю, что проблема как-то связана с тем, что МОК из Unity находится во внешнем классе.Он работает для DI в других классах, но не для Dependency Resolver / service locator в RolesManager ... Stumped .... Любая помощь, пожалуйста.

1 Ответ

0 голосов
/ 03 декабря 2018

решено Оказывается, проблема была именно в том, что говорила Ошибка.Во внешнем классе UnityMvcActivator я использовал

using CommonServiceLocator;

, а в классе CustomRoleProvider я использовал

using Unity.ServiceLocation;

В итоге я изменил эту ссылку и перестроил ее, и она работает, как и ожидалось.Потребовалось время, чтобы найти это.Надеюсь, это поможет кому-то другому, если они столкнутся с этим.

...