我正在尝试在我的程序中实现WCF服务,但我不明白:
根据“编程WCF服务”一书,JuvalLöwy2007O'Reilly Media,。 附录C. - WCF编码标准C2 - 必要: 1.将服务代码放在类库中,而不是放在任何托管EXE中。
我不明白这一点,我应该把代码放在哪里?我的所有类都在我的表单应用程序中定义,如何从服务的类库中调用我的winforms类。
我在这里错过了什么吗?
谢谢, 的Eyal
答案 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
包含托管可执行文件。