Внедрить зависимость в IAuthorizationPolicy

#wcf #inversion-of-control

#wcf #инверсия управления

Вопрос:

У меня есть настраиваемая 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:

В итоге я решил эту проблему с помощью пользовательского 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;
    }
}