Внедрить зависимость в IAuthorizationPolicy - PullRequest
3 голосов
/ 26 октября 2011

У меня есть пользовательская 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 Ответ

1 голос
/ 28 октября 2011

Я решил эту проблему с использованием пользовательского ServiceHost и ServiceHostFactory. Фабрика отправляет контейнер IoC узлу обслуживания, который добавляет новую политику со ссылкой на контейнер. Теперь политика может использовать контейнер для получения нужных ей объектов.

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;
    }
}
...