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

我還沒有運行該代碼,但它應該指向你在正確的方向。