1

以下是ClaimsAuthenticationManager.NET 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容器。控制器注入依赖项工作正常。

但是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?

回答

1

我还没有使用Unity,但是您可以在对象的实例不在您的控制范围内的情况下使用ServiceLocator。注册服务定位在你的Application_Start()

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你应该能够调用的服务定位,以解决您的UOW您ClaimsTransformer

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

我还没有运行该代码,但它应该指向你在正确的方向。