gpt4 book ai didi

wcf - WCF ClaimsAuthenticationManager 中的依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-02 04:27:15 24 4
gpt4 key购买 nike

我已使用 Ninject 成功为我的 WCF 服务配置 DI。每个服务类都有一个构造函数,Ninject 在运行时将实例注入(inject)其中。

public class MessageService : ServiceBase,IMessageService
{
private readonly IMessageRepository _messageRepository;
private readonly IMappingEngine _mapper; // AutoMapper mapping engine

// Instances injected in constructor by Ninject
public MessageService(IMessageRepository messageRepository, IMappingEngine mapper)
{
_messageRepository = messageRepository;
_mapper = mapper;
}
...
}

我的理解是,这是通过告诉Wcf使用NinjectServiceHostFactory来激活服务来实现的。

一切都很好......这是一种享受。

我有许多由 wcf 服务项目引用的类库。这些库之一具有派生自 ClaimsAuthenticationManager 的类。它旨在将传入的声明转换为特定领域的声明。 WCF 脚手架在运行时实例化此类,作为身份管道的一部分。我希望此类使用存储库模式从数据库中获取身份的业务角色。然后,它将创建一个具有特定于域的声明的新 ClaimsIdentity。现在我可以新建一个存储库实例,但我希望 Ninject 在运行时注入(inject)它。我创建了一个带有存储库接口(interface)参数的构造函数,天真地希望 Ninject 能够完成它的工作。 WCF 失败,因为它找不到无参数构造函数。

当我在类库中基本上没有引用 Ninject 内核时,如何让 Ninject 注入(inject)实例?

我的理解是,IoC 容器应该在组合根处创建,在我的例子中,它位于 WCF 服务主机内。由于它是实例化我的类的 Wcf 管道,因此我无法控制该过程来连接依赖项。还是我呢?

最佳答案

唯一的方法是在 global.asax 中或在 WCF 调用之前的任何位置以编程方式设置 System.IdentityModel.Services.FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthorizationManager。

protected void Application_Start()
{
...
FederatedAuthentication.FederationConfigurationCreated += FederatedAuthentication_FederationConfigurationCreated;
...
}

void FederatedAuthentication_FederationConfigurationCreated(object sender, System.IdentityModel.Services.Configuration.FederationConfigurationCreatedEventArgs e)
{
var cam = DependencyResolver.Current.GetService<ClaimsAuthenticationManager>(); // Instantiate your implementation here using any IoC you want.
e.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager = cam;
}

如果您将使用 global.asax,那么不要忘记添加到 web.config:

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

关于wcf - WCF ClaimsAuthenticationManager 中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19759318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com