6

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

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 在运行时注入它。我创建了一个带有存储库接口参数的构造函数,非常天真地希望 Ninject 能做到这一点。WCF 失败,因为它找不到无参数构造函数。

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

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

4

1 回答 1

2

唯一的方法是在 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>
于 2014-03-18T07:07:05.930 回答