2

一篇一篇文章中,任何关于在IIS 中使用 IOC 容器(Unity、Windsor 等)的讨论都涉及到自定义 ServiceHostFactory 和自定义 ServiceHost 的创建。

我能看到的唯一原因是,可以将具有 IInstanceProvider 相关负载的自定义服务行为应用于所有服务。所以我试图理解为什么整个事件没有通过匿名服务配置来简化。这样的配置将允许将自定义行为应用于所有服务,而无需使用自定义 ServiceHostFactory 和自定义服务主机。

也就是说,我可以想象自定义服务主机是必要的唯一原因是自定义 IInstanceProvider 是否与每个 WCF 实例或上下文实例一起回收。当然,我希望每次启动 IIS ServiceHost 时只建立一次 IOC 容器绑定,而不是重复或不定期地建立。

如果我的自定义 IInstanceProvider 确实偶尔被回收,那么我可以将我的 IOC 容器放入自定义服务主机中 - 以确保它尽可能长时间地存在。

但同样,如果我的自定义 IInstanceProvider 将与内置服务主机一样长,那么为什么不跳过自定义服务主机工厂和自定义服务主机呢?

事实上,更进一步,如果我将 IOC Container 放入自定义 IInstanceProvider 的静态成员中,那么 IInstanceProvider 是否被不定期回收也没关系。它来了一个完整的循环:为什么我需要或想要自定义 ServiceHostFactory 和自定义 ServiceHost 来使用带有 WCF 的 IOC 容器?

4

3 回答 3

2

出色地。这是因为大多数 IoC/WCF 集成(如的)不仅仅是创建您的服务(及其依赖项)。

自定义生命周期/处置

当请求结束时,一切都应该得到正确的清理。您的服务和您的 IoC 类使用不同的生命周期。

仅在InstanceProvider.

IContractBehavior / IServiceBehavior

您可以在容器中注册行为并自动将它们添加到您的 WCF 服务中。

于 2012-08-30T06:28:01.163 回答
2

就个人而言,我喜欢使用不需要任何ServiceHostFactoryServiceHostServiceBehaviorInstanceProvider组合的设计,并且不必在 .svc 文件中注册工厂。我喜欢我的 WCF 服务,它只是消息传递架构之上的一个非常薄的层,这使您免于使用这个 WCF 集成的东西。您可以在此处阅读有关此类设计的更多信息。

于 2012-09-25T13:12:19.693 回答
1

有趣的问题!我能想到这样做的唯一原因是您不希望将永远不会更改的项目(即 WCF 服务使用的 IoC 容器)弄乱您的 app.config。我尝试将 app.config 的使用限制为最终用户/开发人员可能想要更改而不重新编译的内容(在大多数情况下,不会太多)。这使其更具可读性,并且通常更容易以编程方式指定配置,因为与配置文件相比,程序代码中对智能感知和编译时检查有更好的支持。

但是,此论点可能不适用于您链接到的第一篇文章,因为他们实际上是通过 app.config 设置其 IoC 容器。所以在这种情况下,这可能是一个双重标准。我从来没有真正理解为什么人们想通过外部配置文件来设置他们的所有依赖项。在大多数情况下,在 app.config 中存储静态配置对我来说似乎有点过头了。

于 2012-08-29T16:45:45.877 回答