自定义角色提供者,Unity和服务定位器模式

时间:2018-11-30 15:35:14

标签: c# asp.net-mvc inversion-of-control service-locator

我对这个问题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()类之后调用。

但是会引发错误 enter image description here

我不太确定如何解决它。它说我需要设置服务位置提供者。我相信这个问题与外部课程中的Unity IOC有关。它适用于其他类中的DI,但不适用于RolesManager中的Dependency Resolver /服务定位器。

1 个答案:

答案 0 :(得分:1)

已解决事实证明,问题实际上出在错误中。在我使用的外部UnityMvcActivator类中,

using CommonServiceLocator;

以及我正在使用的CustomRoleProvider类中

using Unity.ServiceLocation;

我最终改变了那个参考,并对其进行了重建,它可以按预期工作。花了一段时间找到这个。希望这对其他人有帮助。