【问题标题】:WCF One ServiceHost for many WCF Libraries用于许多 WCF 库的 WCF 一个 ServiceHost
【发布时间】:2014-02-17 15:15:34
【问题描述】:

如何在一个地方托管来自不同 wcf 库的服务?

假设我有 2 个 WCF 库 dll,如下所示

.DLLA

 Public Class clientA : InterfaceA

.DLLB

 Public class clientB : InterfaceB

两个接口都有服务契约属性和它们自己的操作契约。 我将这两个 dll 放在一个共享文件夹中,这样我就可以动态加载它们并将它们作为服务托管

现在我想创建一个“AutoHosting”控制台应用程序作为中间层,但只使用一个 ServiceHost 来托管这两个服务并分配相同的 UriListen。

PS:我也希望解决方案尽可能灵活。比如以后我添加DLLC,希望ServiceHost可以在不修改“AutoHosting”部分的情况下自动获取DLLC服务

如果有最好的方法,请告诉我。

【问题讨论】:

  • 要做到这一点,两个人中的一个需要做一些“额外的工作”。 DLL 的创建者需要编写它,以便可以在 app.config 中没有配置设置的情况下运行服务(无论是硬编码值还是备用配置文件位置),或者 DLL 的用户需要修改他的配置文件DLL 的已发布端点的设置。你想做什么,每个人的解决方案都略有不同。
  • 也有可能 DLLA 和 DLLB 都可以引用单个项目,该项目可以定义主“插件接口”,DLL 需要在一个类中实现该主“插件接口”,该类可以返回诸如名称之类的信息他们发布的类和接口在 DLL 中可用。
  • 斯科特,感谢您的回复。但这很好,因为需要添加 50 多个 dll,所以如果需要额外的工作,我们会这样做。我从网上找到的唯一解决方案是使用部分类,但我不想使用它,因为每次添加一些服务或接口时,我都需要重新编译我的 dll
  • "****还有可能 DLLA 和 DLLB 都可以引用一个可以定义主“插件...”的项目删除/添加新 dll 时需要重新编译
  • 不,你不能这样做。一个ServiceHost 承载正好一个 服务实现类。唯一的选择是拥有一个实现多个服务契约(多个接口)的服务实现类。

标签: c# wcf


【解决方案1】:

根据您问题中的 cmets,我想我终于理解了您的主要问题。

Scott,是的,我认为这种方法,但是当客户端 dll 计数超过 50+ 时,我将暴露 example.org/MyServices/Client01 ... example.org/MyServices/Client50。那么如果一个客户想要使用所有这些 app.config,那么你会觉得很糟糕

如果你想要一个所有东西都可以同时讨论的大师班(我并不是说这是一个好主意,我只会使用巨大的客户端 app.config 文件)你需要动态生成一个类将充当服务端点,实现定义的所有接口并代理对 DLL 的调用。

所以理论上大师班看起来像

[ServiceContract]
public interface IMasterInterface : InterfaceA, InterfaceB
{
}

public class MasterClass : IMasterInterface
{
    public MasterClass()
    {
        aInstance = new DllA.clientA();
        bInstance = new DllB.clientB();
    }

    DllA.InterfaceA aInstance; //Use full namespaces to prevent conflicts.
    DllB.InterfaceB bInstance;

    public void DllA.InterfaceA.Foo() //Use explicit interfaces to prevent name conflicts
    {
        aInstance.Foo();
    }

    public bool DllB.InterfaceB.Foo()
    {
       return bInstance.Foo();
    }
}

现在每次添加或删除 DLL 时都必须重新编译程序,问题是,您仍然会这样做但不会在开发时进行

.NET 提供的类允许您使用CodeDOM 在运行时动态生成程序集。您需要在程序每次启动时重新创建MasterClassIMasterInterface 类(或者至少在您检测到DLL 发生变化时)。只需枚举 DLL 并构建您的单一主类和接口。

重要提示:我不知道当您使用添加或删除的新 DLL 进行重建时,这是否会破坏与客户的合同。另外我不知道名称冲突将如何看待客户端。我仍然建议您不要使用这种方法,而只使用一个大的 app.config 而不是指向多个端点。如果您使用 Visual Studio 附带的 SvcConfigEditor.exe 等工具手动生成 app.config,您可以通过在多个类似服务之间重用配置部分来使其更小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多