WCF服务 - 编码标准 - 我的类库放在哪里?

时间:2009-12-18 16:53:08

标签: c# .net wcf

我正在尝试在我的程序中实现WCF服务,但我不明白:

根据“编程WCF服务”一书,JuvalLöwy2007O'Reilly Media,。 附录C. - WCF编码标准C2 - 必要: 1.将服务代码放在类库中,而不是放在任何托管EXE中。

我不明白这一点,我应该把代码放在哪里?我的所有类都在我的表单应用程序中定义,如何从服务的类库中调用我的winforms类。

我在这里错过了什么吗?

谢谢, 的Eyal

3 个答案:

答案 0 :(得分:5)

我喜欢这样构建我的WCF解决方案:

YourProject.Contracts (类库)
包含所有服务,操作,故障和数据协定。可以在纯.NET-to-.NET场景中在服务器和客户端之间共享

YourProject.Service (类库)
包含实现服务的代码,以及实现此目的所需的任何支持/帮助程序方法。没别了。

YourProject.ServiceHost (可选 - 可以是Winforms,控制台应用,NT服务)
包含用于调试/测试的服务主机,或者也可能用于生产。

这基本上给了我服务器方面的东西。

在客户端:

YourClient.ClientProxies (类库)
我喜欢将我的客户端代理打包到一个单独的类库中,以便它们可以被多个实际的客户端应用程序重用。这可以使用svcutil或“添加服务引用”并手动调整生成的可怕的app.config,或者通过使用ClientBase<T>ChannelFactory<T>构造手动实现客户端代理(共享契约程序集时)来完成

1-n个实际客户(任何类型的应用)
通常只会引用客户端代理程序集,或者也可能引用契约程序集(如果它正在共享)。这可以是ASP.NET,WPF,Winforms,控制台应用程序,其他服务 - 您可以命名。

那是这样的;我有一个漂亮而干净的布局,我一遍又一遍地使用它,我真的认为这使我的代码更清晰,更容易维护。

这是受到Miguel Castro的Extreme WCF screen cast在DotNet Rocks电视上与Carl Franklin的启发 - 强烈推荐的屏幕演员!

答案 1 :(得分:3)

是的,这有点令人困惑。

我们在这里讨论服务实现。 Loewy在这里的意思是实现服务的代码应该在一个单独的项目中。托管WCF服务的代码(即实现服务合同的类)除了调用该服务实现代码之外什么都不做。

因此,您的Windows窗体客户端应用程序使用代理,代理又调用WCF服务应用程序托管层,后者又调用您的服务逻辑。

这是一个非常好的主意,更进一步,在UI端有三层,在服务端有四层。名称空间可能是

Company.Project.UI.WinForms
Company.Project.UI
Company.Project.ServiceClient

Company.Project.ServiceHost
Company.Project.Service
Company.Project.BusinessLogic
Company.Project.Persistence

对于更简单的项目来说,这将是一种过度杀伤,但除了(比方说)一种形式或两种服务方法之外,它将使生活变得更加容易。尤其是,单独测试每一层应该相当简单。

答案 2 :(得分:0)

以下是Löwy推荐的典型项目结构:

MyProject.Data
MyProject.Logic
MyProject.Services
MyProject.ServiceHosts
MyProject.Presentation

然后MyProject.ServiceHosts将引用MyProject.Services并公开其中定义的服务。所以在Löwy的语言中,MyProject.Services是类库,MyProject.ServiceHosts包含托管可执行文件。