2012-08-11 101 views
2

我刚刚开始学习WCF,并且我来自非Web背景。阻止WCF暴露我的整个类?

我已经构建了一个3层的桌面应用程序,它编译成一个exe,它在本地运行。

现在我想将整个业务逻辑层移到一个中心服务器,并使GUI成为客户端应用程序。

据我所知,WCF应该是我的解决方案,事实上,它帮助我实现了我想要的。

我负责运行远程功能,这是我需要的基本功能。

我现在的问题是,我不太了解架构

例如,我的一个服务从我的Business Logics层返回数据类型(类)。

该类通过WCF机制自动变为可用于客户端。

但问题是,这个类包含一些方法,我绝对不想暴露给客户端。

例如一个保存方法(保存到数据库)。

此外,有时我甚至不想让客户端更改该类的所有属性,因为此类可能会发送到我的一个服务。

我不想重新验证服务中的类实例。

我应该怎么办?我应该建立另一个层次,我公开给客户的业务逻辑的受限版本吗?还是有什么办法只暴露我的课程的一部分到客户端,而不会限制它自己的服务器?

我知道这是一个基本问题,但老实说,我在这里问了很多之前已经搜索过很多东西。我的问题是我不知道要搜索什么。

我的第二个问题是,你有任何建议可以解释我这个架构的任何资源......?

+1

我想你会更好地提取抽象的数据传输对象层。这是一个更灵活的方法,如果您需要切换wcf,则更便于携带。 – Candide 2012-08-11 14:21:31

回答

8

通常,如果你想封装你的业务层,你不想直接公开业务对象。这是因为您现在有一个解耦的客户端,并且您不一定希望每次业务逻辑/属性更改时都必须更新客户端。

这是Data Transfer Objects (DTO)很好地发挥作用。通常,您想要控制您公开的合约(数据和方法)。因此,您可以明确制作组成传输层的其他对象(DTO)。然后,您可以独立安全地更改您的客户端和服务器代码(只要两者仍然满足合同对象)。

这通常需要多一点映射(在每边发送或接收之前),但通常是值得的。

对于WCF,标有[ServiceContract]的接口和类和标有[DataContract]的类通常组成此传输层。

+0

但[DataContract]是什么意思?我的类无论如何都暴露了.. – Letterman 2012-08-11 18:51:47

+0

'[DataContract]'是告诉WCF如何为暴露的方法参数序列化/反序列化的方式。查看更多[here](http://msdn.microsoft.com/en-us/library/ms733127.aspx)。 – 2012-08-11 22:13:46

0

但问题是,这个类包含一些方法,我绝对不想公开给客户端。

你能提供你的类和接口代码的例子吗?如果是这样,我相信你可能会得到更具体的答案。

例如一个保存方法(保存到数据库)。

一种可能的方法是将你的班级分为两类。定义第一个类中的属性,然后将该类用作第二个类的基类。然后使用第二个类来定义方法。这将允许您只返回属性,同时允许您保持代码干爽。

此外,有时我甚至不想让客户端更改该类的所有属性,因为此类可能会发送到我的一个服务。 我不想重新验证服务中的类实例。

虽然你可以在get定义逻辑,并设置每个属性的方法我会强烈建议重新验证服务之间收到任何输入简单,因为任何未来服务于一体的变化或错误,可能会导致在更大的问题,你的应用。此外,这也有助于确保您的应用程序对任何潜在攻击都更加安全。

我应该建立另一层,业务逻辑的受限版本,我公开给客户端?还是有什么办法只暴露我的课程的一部分到客户端,而不会限制它自己的服务器?

我同意上面的答案,你应该能够限制访问不同的属性和方法使用接口中的数据和方法属性。

我的第二个问题是,那么你有任何建议可以解释我这个架构的任何资源......?

如果您正在寻找价格便宜,但非常有价值的基于视频的训练我发现Pluralsight提供是两个建筑,以及WFC服务(顺便说一句,我没有与他们有联系相当不错的课程,只是享受他们的训练)。