对于承载多个WCF服务的C#应用程序,您使用什么项目结构?

对于承载多个WCF服务的C#应用程序,您使用什么项目结构?,c#,visual-studio-2008,wcf,C#,Visual Studio 2008,Wcf,我需要一个C#WinForms应用程序来承载多个WCF服务。那么这些(1或2)中哪一个是合适的呢 我应该创建一个C#WinForms项目和另一个WCF服务库项目吗 或者只是在WCF ServiceLib项目中创建一个表单?--我还能做到这些吗 控制服务生存期,设置服务的属性 打开服务(并将其设置为侦听模式) 关闭服务 要创建的项目数 在一个项目中完成这一切没有问题。事实上,如果WinForms应用程序本身承载服务,那么在一个项目中执行它会更方便,因为您只有一个.exe文件 另一方面,如果要实

我需要一个C#WinForms应用程序来承载多个WCF服务。那么这些(1或2)中哪一个是合适的呢

  • 我应该创建一个C#WinForms项目和另一个WCF服务库项目吗

  • 或者只是在WCF ServiceLib项目中创建一个表单?--我还能做到这些吗

    • 控制服务生存期,设置服务的属性
    • 打开服务(并将其设置为侦听模式)
    • 关闭服务

  • 要创建的项目数

    在一个项目中完成这一切没有问题。事实上,如果WinForms应用程序本身承载服务,那么在一个项目中执行它会更方便,因为您只有一个.exe文件

    另一方面,如果要实现单独的客户机和服务器代码,则可以方便地将服务接口(或整个服务)放在单独的dll中。这样,客户端和服务器都可以引用相同的DLL

    这实际上是一个基于您试图做的更大的图景的架构决策。对于承载一些服务的简单WinForms exe,我通常只使用单个项目

    在WCF ServiceLib项目中可以做什么

    默认的WCF服务库项目生成一个.dll,因此如果要运行它并显示WinForms,则必须将其更改为生成一个.exe。在.exe中,您可以执行列表中的所有操作。具体而言,在正在运行的应用程序中,您可以:

    • 更改服务配置
    • 控制服务是否处于活动状态
    • 启动和停止服务

    您还可以连接到自己的服务进行测试。

    要创建的项目数

    在一个项目中完成这一切没有问题。事实上,如果WinForms应用程序本身承载服务,那么在一个项目中执行它会更方便,因为您只有一个.exe文件

    另一方面,如果要实现单独的客户机和服务器代码,则可以方便地将服务接口(或整个服务)放在单独的dll中。这样,客户端和服务器都可以引用相同的DLL

    这实际上是一个基于您试图做的更大的图景的架构决策。对于承载一些服务的简单WinForms exe,我通常只使用单个项目

    在WCF ServiceLib项目中可以做什么

    默认的WCF服务库项目生成一个.dll,因此如果要运行它并显示WinForms,则必须将其更改为生成一个.exe。在.exe中,您可以执行列表中的所有操作。具体而言,在正在运行的应用程序中,您可以:

    • 更改服务配置
    • 控制服务是否处于活动状态
    • 启动和停止服务

    您还可以连接到自己的服务进行测试。

    我喜欢这样将我的WCF项目分开:

    • 带有契约的类库——您的所有服务契约、数据契约等。如果您的解决方案变大,这甚至可能是几个类库,每个类库处理解决方案的一个区域/主题
    • 一个带有服务实现的类库——同样,如果你有很多服务,也许你甚至会选择几个类库
    • Winforms或console应用程序作为服务主机进行测试和调试

    • 客户端代理/代理的类库——同样,如果有意义的话,它可以是几个库,甚至每个“逻辑子系统”一个库

    • 最后是您实际的客户端——Winforms、WPF,以及任何实际使用这些客户端代理的应用程序
    这背后的原因是,我希望有一个清晰的关注点分离——因为服务共享的只是属于单独程序集的契约(服务和数据契约)。因为服务主机实际上与服务导入无关,所以这两者也应该分开

    在您的情况下,您将让您的Winforms应用程序(或多个应用程序)成为实际的服务主机-例如,您将在Winforms应用程序中实例化一个
    ServiceHost
    类,并在该
    ServiceHost
    中承载相应的服务(来自服务程序集)-当然,您可以拥有任意数量的服务主机!(您需要提供的每项服务一项)

    在客户端,将代理放在一个单独的程序集中是值得的,因为该程序集现在可以在多个客户端项目之间共享,而代码只在一个位置

    由于我在一个单独的程序集中有契约,只要我控制.NET到.NET通信的两端,我就可以在服务器和客户端之间共享该程序集并重用相同的类型,而不是让客户端创建自己的、单独的数据类型


    很多这些东西都是从米格尔·卡斯特罗的优秀电影中取来的——绝对值得一看!(基思·埃尔德的也是如此——也是很棒的东西!)

    我喜欢像这样把我的WCF项目分开:

    • 带有契约的类库——您的所有服务契约、数据契约等。如果您的解决方案变大,这甚至可能是几个类库,每个类库处理解决方案的一个区域/主题
    • 一个带有服务实现的类库——同样,如果你有很多服务,也许你甚至会选择几个类库
    • Winforms或console应用程序作为服务主机进行测试和调试

    • 客户端代理/代理的类库——同样,如果有意义的话,这可能是几个库——一个用于eac