.NET ClaimsAuthenticationManager和依赖注入

时间:2014-05-04 09:43:22

标签: .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;
        }

        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?

1 个答案:

答案 0 :(得分: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&gt; Install-Package CommonServiceLocator.UnityAdapter

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