Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在业务层中标记[DataContract]类是一种糟糕的设计吗?_C#_.net_Wcf_Datacontract - Fatal编程技术网

C# 在业务层中标记[DataContract]类是一种糟糕的设计吗?

C# 在业务层中标记[DataContract]类是一种糟糕的设计吗?,c#,.net,wcf,datacontract,C#,.net,Wcf,Datacontract,我需要使用一个类来表示发送到REST WCF服务的客户端请求 但是我想把这个请求也传递给我在业务层的方法。目前,它是WCF服务的一部分 在业务层中标记[DataContract]类是一种糟糕的设计吗 我发现这是一个有用的答案。基本上,您的POCO可以由DataContractSerializer序列化,而无需添加[DataContract]属性 我发现这是一个有用的答案。基本上,您的POCO可以由DataContractSerializer序列化,而无需添加[DataContract]属性 如果

我需要使用一个类来表示发送到REST WCF服务的客户端请求

但是我想把这个请求也传递给我在业务层的方法。目前,它是WCF服务的一部分


在业务层中标记[DataContract]类是一种糟糕的设计吗

我发现这是一个有用的答案。基本上,您的POCO可以由DataContractSerializer序列化,而无需添加[DataContract]属性


我发现这是一个有用的答案。基本上,您的POCO可以由DataContractSerializer序列化,而无需添加[DataContract]属性


如果另一种选择是几乎将契约复制到不同的BL类,只是为了让您感觉更好,不将DataContracts发送到某个层-我想说不要-发送DataContracts

此外,请求、命令和数据传输对象并不是严格意义上的外观对象或模式。您可以在DALAPI中使用请求对象,我假设采用分层架构,以简化方法签名并支持将来的重构,对吗?那么,为什么不在所有层中使用相同的请求对象呢


如果存在部署问题,我想不出与实际的DataContract属性有关的任何问题-这是另一回事。

如果另一个选项是几乎将契约复制到不同的BL类,只是为了让您感觉更好,不将DataContract发送到某个层-我想说不要-发送DataContract

此外,请求、命令和数据传输对象并不是严格意义上的外观对象或模式。您可以在DALAPI中使用请求对象,我假设采用分层架构,以简化方法签名并支持将来的重构,对吗?那么,为什么不在所有层中使用相同的请求对象呢


如果在实际的DataContract属性方面存在部署问题,我想不出任何问题,那就不同了。

如果将来您需要REST WCF客户端请求服务的不同接口,并且您无法控制消费客户端,如果BL严重依赖WCF合同类,则可能会出现问题。您可能很难在不破坏BL的情况下修改服务接口,或者在不破坏与客户端的接口的情况下修改BL


如果以上两项都不适用于您,我会说继续@Rahal在他的评论中所说的我已经+1了他。

如果将来您需要其他WCF客户端请求服务的不同接口,并且您无法控制消费客户端,如果BL严重依赖WCF合同类,则可能会出现问题。您可能很难在不破坏BL的情况下修改服务接口,或者在不破坏与客户端的接口的情况下修改BL


如果以上两项都不适用于你,我会说继续@Rahal在他的评论中所说的,我已经+1了他。

因此,正如我在评论中所说:


如果您对此感觉不好,请引入一个由该类实现的接口,并在您的业务层中使用它。请注意,DataContract属性只是序列化引擎的标记。

如我在注释中所述:


如果您对此感觉不好,请引入一个由该类实现的接口,并在您的业务层中使用它。请注意,DataContract属性只是序列化引擎的标记。

没有简单的对错。这取决于应用程序的复杂性。如果您对此感到不满意,请引入一个由该类实现的接口,并在您的业务层中使用它。请注意,DataContract属性只是序列化引擎的标记。@Rafal:我喜欢这个想法!没有简单的对与错。这取决于应用程序的复杂性。如果您对此感到不满意,请引入一个由该类实现的接口,并在您的业务层中使用它。请注意,DataContract属性只是序列化引擎的标记。@Rafal:我喜欢这个想法+1有一项但书。若该类并没有用DataContract注释,并且并没有任何成员用DataMember修饰,则DataContractSerializer将尝试序列化该类的所有成员。这可能是不可取的,因为它可能会向客户端显示不期望的数据。此外,如果您使用的是自动实现的属性,它们可能无法很好地序列化。检查实际序列化的内容以及它的外观是很重要的。@Nick:谢谢,这是有用的信息。+1附带一条但书。若该类并没有用DataContract注释,并且并没有任何成员用DataMember修饰,则DataContractSerializer将尝试序列化该类的所有成员。这可能是不可取的,因为它可能会向客户端显示不期望的数据。此外,如果您使用的是自动实现的属性,它们可能不会序列化
很好地。检查实际序列化的内容及其外观很重要。@Nick:谢谢,这是有用的信息。