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