我刚刚开始学习WCF,而且我来自非网络背景。
我已经构建了一个3层桌面应用程序,它可以编译成一个在本地运行的exe。
现在我想将整个业务逻辑层移动到一个中心服务器,并使GUI成为客户端应用程序。
据我所知,WCF应该是我的解决方案,事实上,它帮助我实现了我想要的目标。
我管理远程功能,这是我需要的基础。
我现在的问题是,我不太了解架构。
例如,我的一个服务从我的Business Logics层返回数据类型(类)。
此类通过WCF机制自动对客户端可用。
但问题是,这个类包含一些方法,我绝对不希望向客户端公开。
例如Save方法(保存到数据库)。
此外,有时我甚至不想让客户端更改类的所有属性,因为这个类可能会被发送到我的一个服务。
我不想重新验证服务中的类实例。
我该怎么办?我应该构建另一个层,即我向客户端公开的Business Logics的受限版本吗?或者有没有办法只将部分类暴露给客户端,而不是自己限制服务器?
我知道这是一个基本问题,但说实话,我在搜索之前已经搜索了很多。我的问题是我不太清楚要搜索什么。
我的第二个问题是,你对任何可以解释我这个架构的资源有什么建议吗?
答案 0 :(得分:8)
通常,如果要封装业务层,则不希望直接公开业务对象。这是因为您现在拥有一个解耦的客户端,并且您不一定希望每次业务逻辑/属性更改时都必须更新客户端。
这是Data Transfer Objects (DTO)很好地发挥作用的地方。通常,您希望控制您公开的合同(数据和方法)。因此,您将明确地制作构成传输层的其他对象(DTO)。然后,您可以安全地单独更改客户端和服务器代码(只要两者仍然满足合同对象)。
这通常需要更多的映射(在你发送或接收之前),但它通常是值得的。
对于WCF,标有[ServiceContract]
的接口和类以及标有[DataContract]
的类通常构成此传输层。
答案 1 :(得分:1)
在WCF中向客户端公开方法,您必须使用OperationContractAttribute标记它。因此,如果您不希望客户使用您的Save方法,请不要使用此属性标记它们。
此处有更多信息:http://msdn.microsoft.com/en-us/library/system.servicemodel.servicecontractattribute.aspx
与属性完全相同,但属性不同:DataMemberAttribute。如果你不想让客户看到它,就不要用它来标记它们(DataMember attribute)
答案 2 :(得分:0)
但问题是,这个类包含一些方法,我绝对不希望向客户端公开。
您是否能够提供类和接口代码的示例?如果是这样,我相信你可能会得到更具体的答案。
例如Save方法(保存到数据库)。
一种可能的方法是将您的班级分成两个班级。在第一个类中定义属性,然后将该类用作第二个类的基类。然后使用第二个类来定义方法。这将允许您只返回属性,同时允许您保持代码干燥。
此外,有时我甚至不想让客户端更改类的所有属性,因为这个类可能会被发送到我的一个服务。 我不想重新验证服务中的类实例。
虽然您可以在每个属性的get和set方法中定义逻辑,但我强烈建议重新验证服务之间收到的任何输入,因为一个服务中的任何未来更改或错误都可能导致整个应用程序出现更大的问题。此外,这还有助于确保您的应用程序更安全,以防止任何潜在的攻击。
我是否应该构建另一个层,即我向客户端公开的Business Logics的受限版本?或者有没有办法只将部分类暴露给客户端,而不是自己限制服务器?
我同意上述答案,您应该能够使用接口中的数据和方法属性限制对不同属性和方法的访问。
我的第二个问题是,你对任何可以解释我这个架构的资源有什么建议吗??
如果您正在寻找价格低廉但非常有价值的视频培训,我发现Pluralsight提供的课程对于建筑和WFC服务都非常有用(顺便说一句,我与他们无关,只是喜欢他们的培训)。