Visual Studio和SvcUtil可用于生成代理代码以与服务集成。在VS 2010和之前,如果您想维护共享类型的跨层参考库,则会出现问题。这迫使几种解决方法来解决数据协定类型中的等价问题以及无法正确使用本地类型。
问题的网址引用:WCF Client Code Generation - Issue with "Reuse types from referenced assemblies"
我使用的是Visual Studio 2012,ASP.NET 4.5,C#代码
我的问题:“VS 2012中是否修复了跨程序集的类型重用?”我现在正在移植一些代码,但我也担心这个错误可能会让人头疼。我可以运行测试用例,但如果有人已经有了答案,它会更快。根据我的经验,如果你似乎无法在网上找到答案(谷歌搜索并继续获得2011年 - 问题仍然存在),那么修复可能不会到位。
我的目标:允许我未来的开发团队在企业.Net应用程序层和层中重用相同类型的库[演示文稿(网站,移动应用程序层 - 服务器端,...),域(服务,业务逻辑层) ,数据访问层)]。我想确保一些统一性和代码重用。代码将在每一层中尽可能“松散耦合”,但通过参考组件将确保类型。同样,我希望代码能够支持第三方的外部集成。因此,我需要从DataContractAttribute构造所有代理类型,为面向外部的服务修饰类型,并维护我的服务器端应用程序的引用类型。
我会遇到任何泥潭吗?上述链接中的问题是否已得到解决?请指教。
答案 0 :(得分:4)
您报告为从引用的程序集重用类型选项中存在的错误是因为通过使用/ r标志指定重用VS调用svcutil.exe。
但是,svcutil.exe使用DataContractSerializer
来帮助生成代码,不幸的是,在解析服务合同时,它有一个strict set of rules。
因此,除非您服务XSD遵守这套规则,否则svcutil.exe将切换为使用XmlSerializer
,它不支持/ r标志(或重用)。因此,您将无法重复使用类型。
如果您可以引用实际的服务合同类型(通过二进制引用),这是一个更好的解决方案,因为您可以一起取消服务引用。您还可以使用WSCF.blue生成服务合同,因为它拥有自己的自定义序列化程序并支持重复使用类型。
答案 1 :(得分:2)
在我的情况下,WebService和WebApp都引用了包含域实体的同一程序集。当然,每个实体都使用DataContractAttribute进行修饰,但是当使用WebService公开的端点在WebApp中生成ServiceReference时,VS2012似乎忽略了Reuse Type in Referenced Assemblies
,这导致了本地程序集中类型的其他副本。然后(经过几个小时的试验和错误)我在WebService的界面的ServiceContractAttribute中添加了一个Namespace参数。添加后,已解析的ServiceReference开始根据需要引用我的shared
DataContract类型。
[ServiceContract(Namespace="http://www.example.com/Demo.WebService/")]
public interface IConfigurationService { ..methods here.. }