将依赖注入IAuthorizationPolicy

时间:2011-10-26 13:38:48

标签: wcf inversion-of-control

我有一个自定义IAuthorizationPolicy,它依赖于存储库

internal class CustomAuthorizationPolicy : IAuthorizationPolicy
{
    private IBaseRepository _baseRepository;

    public CustomAuthorizationPolicy(IBaseRepository baseRepository)
    {
        _baseRepository = baseRepository;
    }
}

在web.config

中配置如下
  <serviceAuthorization principalPermissionMode="Custom">
    <authorizationPolicies>
      <add policyType="CustomAuthorizationPolicy" />
    </authorizationPolicies>
  </serviceAuthorization>

此操作失败,因为WCF在创建策略时无法注入所需对象。 它需要一个无参数的构造函数。

我正在使用StructureMap并且有一个自定义的IInstanceProvider来处理我的应用程序中的所有其他依赖项。但我无法理解这种情况。

这可能吗?

1 个答案:

答案 0 :(得分:1)

我最终使用自定义ServiceHost和ServiceHostFactory解决了这个问题。 工厂将IoC容器发送到servicehost,后者将添加新策略以及对容器的引用。现在,策略可以使用容器来获取所需的对象。

public class CustomServiceHost : ServiceHost
{
    public CustomServiceHost(IContainer container, Type serviceType, params Uri[] baseAddresses)
        : base(serviceType, baseAddresses)
    {
        // Keep existing policies
        var policies = new List<IAuthorizationPolicy>();
        if (Authorization.ExternalAuthorizationPolicies != null)
        {
            policies.AddRange(Authorization.ExternalAuthorizationPolicies);
        }

        // Add new policy
        policies.Add(new PasswordAuthorizationPolicy(container));
        Authorization.ExternalAuthorizationPolicies = policies.AsReadOnly();

        // Set correct mode
        this.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.Custom;
    }
}