.NET ClaimsAuthenticationManager和依赖项注入

.NET ClaimsAuthenticationManager和依赖项注入,.net,inversion-of-control,asp.net-mvc-5,claims-based-identity,.net,Inversion Of Control,Asp.net Mvc 5,Claims Based Identity,以下是ClaimsAuthenticationManager的框架 namespace ABC { public class ClaimsTransformer : ClaimsAuthenticationManager { private IUow _iUow; public ClaimsTransformer(IUow uow) { this._iUow = uow; }

以下是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?

我没有使用Unity,但在对象实例化不在您控制范围内的情况下,您可以使用ServiceLocator。在应用程序_Start()中注册ServiceLocator

受保护的无效应用程序\u Start()
{            
UnityServiceLocator locator=新的UnityServiceLocator(ConfigureUnityContainer());
ServiceLocator.SetLocatorProvider(()=>locator);
}
专用静态IUnityContainer ConfigureUnityContainer()
{
UnityContainer容器=新的UnityContainer();
RegisterType(新的ContainerControlledLifetimeManager());
返回容器;
}
然后在您的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)
    {
        ...
    }
}
公共类索赔格式:索赔认证管理器
{
公共工作单位
{
get{return ServiceLocator.Current.GetInstance();}
}
公共重写ClaimsPrincipal身份验证(字符串resourceName,ClaimsPrincipal incomingPrincipal)
{
...
}
}
有关详细信息,请参阅

为统一实施

Nuget:PM>安装程序包CommonServiceLocator.UnityAdapter

我没有运行这段代码,但它应该为您指出正确的方向

public class ClaimsTransformer : ClaimsAuthenticationManager   
{
    public IUow UnitOfWork
    {
        get { return ServiceLocator.Current.GetInstance<IUow>(); }
    }

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