【问题标题】:.NET ClaimsAuthenticationManager and Dependency Injection.NET ClaimsAuthenticationManager 和依赖注入
【发布时间】:2014-05-04 09:43:21
【问题描述】:

以下是 ClaimsAuthenticationManager 的框架

namespace ABC
{
    public class ClaimsTransformer : ClaimsAuthenticationManager
    {
        private IUow _iUow;

        public ClaimsTransformer(IUow uow)
        {
            this._iUow = uow;
        }

        public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
        {
            ...
        }
    }
}

我将 Unity.Mvc5 用于 IoC 容器。注入依赖对 Controller 来说效果很好。

但 DI 不适用于 ClaimsAuthenticationManager。我收到以下错误

Parser Error Message: ID1024: The configuration property value is not valid.
Property name: 'type'
Error: 'Constructor on type 'ABC.ClaimsTransformer' not found.'

如何将依赖项注入到 ClaimsAuthenticationManager?

【问题讨论】:

    标签: .net inversion-of-control asp.net-mvc-5 claims-based-identity


    【解决方案1】:

    我没有使用过 Unity,但您可以在对象的实例化不受您控制的情况下使用 ServiceLocator。在 Application_Start() 中注册 ServiceLocator

    protected void Application_Start()
    {            
        UnityServiceLocator locator = new UnityServiceLocator(ConfigureUnityContainer());
        ServiceLocator.SetLocatorProvider(() => locator);            
    }
    
    private static IUnityContainer ConfigureUnityContainer()
    {
        UnityContainer container = new UnityContainer();
        container.RegisterType<IFoo, Foo>(new ContainerControlledLifetimeManager());
        return container;
    }
    

    然后在您的 ClaimsTransformer 中,您应该能够调用 ServiceLocator 来解决您的 ClaimsTransformer 中的 Uow

    public class ClaimsTransformer : ClaimsAuthenticationManager   
    {
        public IUow UnitOfWork
        {
            get { return ServiceLocator.Current.GetInstance<IUow>(); }
        }
    
        public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
        {
            ...
        }
    }
    

    详情请见CommonServiceLocator

    Here 用于 Unity 实现。

    Nuget: PM> 安装包 CommonServiceLocator.UnityAdapter

    我没有运行此代码,但它应该会为您指明正确的方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 2020-12-20
      • 2018-03-03
      • 2021-10-23
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      相关资源
      最近更新 更多