【发布时间】:2011-08-16 21:42:47
【问题描述】:
假设我有 3 个程序集,Example.Core、Example.Contracts、Example.WcfServices。在我的合同程序集中,我定义了一个接口并添加了一些操作,例如ICalculator,具有操作 Add(double a, double b)。在我的 WcfServices 程序集中,我有一个作为 Wcf 服务公开的 ICalculator 实现。
现在我的问题是……在我的 Example.Core 程序集中,我如何针对该接口进行编程,同时保持一切解耦(以允许我有该接口的替代实现)。如果我有一个需要 ICalculator 的类,我可以从 ChannelFactory 创建一个并使用它,或者我可以在构造函数中注入一个实例。如果我在类中创建一个,那么我将依赖项放在 ChannelFactory/Wcf 上的类中,我真的不想这样做。如果我在构造函数中注入一个实例,那么注入类将如何管理和整理 wcf 服务?似乎虽然我有一个界面,但我没有干净的方式使用它。我看过类似 NInject 的东西,但我不相信它会在 ChannelFactory 出现故障时清理它(至少我还没有找到任何文档表明它知道何时在通道上调用 Abort 而不是 Close)。
我最终做的是再次实现我的界面并使用此问题中描述的方法:creating WCF ChannelFactory<T> 并仅调用服务上的方法。这对我来说有点“味道”,因为我再次打包所有电话只是为了确保频道正确关闭/中止。
是否有任何模式/方法干净地具有两个接口的实现,其中之一是 Wcf 服务?
谢谢,
迈克。
【问题讨论】:
-
你问的是服务端还是客户端?
-
我想知道客户端。澄清一下,如果我在单独的程序集中创建一个接口并且有多个实现,由于难以管理 wcf 实现的对象生命周期,交换实现变得困难,那么最好的模式是什么?
-
好的,谢谢。我想我明白了......我需要注入一个工厂而不是接口,并且工厂负责管理代理的生命周期(并且在 Channel 的情况下,它可能应该挂钩其故障事件以正确关闭它如果它有故障)。谢谢。
标签: wcf inversion-of-control ninject