基于额外参数创建WCF服务的依赖项

时间:2011-01-14 20:21:30

标签: c# wcf dependency-injection

在我们的ASP.NET项目中,我们有一个会话管理器服务接口,我们用它来查找有关当前用户的信息。例如:

var actorId = _sessionManager.CurrentActivePerson.PersonId;

此会话管理器通过基于构造函数的依赖注入提供给类。

现在,我们有一个WCF服务,我们希望根据具体情况实例化不同的DI绑定:

  • 如果消费者已为会话提供了用户名,我们希望使用会话管理员将该用户视为当前人。
  • 否则,我们希望以某种方式要求提供域ID,使用与该域的系统人员绑定的会话管理器。

为了使其正常工作,我们需要允许使用者提供域ID作为参数,尽管它没有被指定为服务本身的参数。然后,当HostFactory创建服务实例时,我们需要能够从DI绑定方法访问此参数。

有人对我们如何做到这一点有任何建议吗?

注意:

  • 我已经知道如何创建依赖绑定:问题是将这个额外的参数传递给服务的工厂。
  • WCF服务作为SOAP端点公开,并使用基于证书的安全性。

1 个答案:

答案 0 :(得分:2)

这听起来像是一个认证/授权问题而不是DI问题。如果是这种情况,最正确的低级解决方案实际上是implement a custom token

这是一项相当复杂的任务,因此您应该认真考虑切换到基于声明的授权Windows Identity Foundation提供了许多工具来完成此任务。

这意味着您不必管理两个根本不同的安全上下文(用户名与域ID),而是将身份管理外部化,这样您就不必处理这种交叉问题< / strong>在应用程序代码中。这样可以更好地分离关注点

但是,如果您确实需要将依赖项的解析推迟到实际方法调用the universal solution is to inject an abstract factory

如果您需要有关如何为WCF启用构造函数注入的信息,请按以下步骤操作:Injecting data to a WCF service