2009-11-17 53 views
4

设置Visual Studio服务引用的自定义模板?

我想在Visual Studio中使用Web服务。我添加了一个服务引用,将它指向一个WSDL文档。我得到了一堆像冠军一样工作的生成代码。

的问题

在服务引用对话框,我所选择的“内部”作为“为生成的类访问级别”。看起来好像将“internal”关键字放在WhateverSoapClient类的前面。 Groovy的。但是,生成的模型类都在“公开部分”关键字前面。 “部分”部分是好的(甚至是期望的),但不是公众。我希望这些类也是内部的。

解决方案?

当然,Visual Studio(svcutil.exe?)正在使用一个模板来生成Reference.cs,对吧?有什么方法可以更改该模板或指定替代模板吗?还是我吠叫错了树?

谢谢!

我对这件事很陌生,所以我可能对这个问题措辞不好。


编辑:针对Tuzo的评论,我连接Visual Studio中的以下内容:

https://sebomarketing.worldsecuresystems.com/CatalystWebService/CatalystEcommerceWebservice.asmx?WSDL

VS生成一个名为CatalystEcommerceWebserviceSoapClient的内部类,该类有一个名为Catalogue_Retrieve()的方法。 Catalogue_Retrieve()返回一个Catalog对象,并且Visual Studio生成Catalog类为“public partial”。我希望它是内部的。

这里是被如何产生什么样的一些片段:

internal partial class CatalystEcommerceWebsierviceSoapClient : System.ServiceModel.ClientBase<BcApi.EcommerceApi.CatalystEcommerceWebserviceSoap>, BcApi.EcommerceApi.CatalystEcommerceWebserviceSoap { 
    public BcApi.EcommerceApi.Catalogue Catalogue_Retrieve(...) { 
     // ... 
    } 
} 

public partial class Catalogue : object, System.ComponentModel.INotifyPropertyChanged { 
    // ... 
} 

而且响应杰米,我熟悉感谢SubSonic T4模板。所以我已经为这个问题找到了一些与T4相关的答案。不过,我可能会多挖一点。谢谢你的提示。

+4

Visual Studio在其代码生成中使用了一个称为“T4模板”的系统(可能全部是?)。也许这可能是一个有用的术语,包括在谷歌搜索。 – 2009-11-17 23:04:30

+0

当我添加服务引用并选择访问级别为内部时,在生成的文件中看不到任何“公开部分”。我的ServiceClient和我的DataContract类型都被标记为“内部部分”。如果你可以发布一些示例代码,这可能会有所帮助吗? – 2009-11-18 03:37:15

回答

2

你不包括任何的属性装饰公共类,但我猜,如果你这样做了,属性之一将是:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="blahblahblah")] 

如果是这样,那么SvcUtil工具被拒绝作出这些类内部的原因是由于类数据如何限制b eing序列化; XmlSerializer需要这些类是公共的。

因此,svcutil可以使内部唯一的东西是服务接口和服务实现类。

即使您要创建一个将所有这些类生成为内部的自定义T4模板,您可能会发现您不再能够与该服务进行通信。

-1

如果您不打算更新服务参考,您可以手动编辑此文件。是的,如果您更新,更改将会丢失,但不会自动更新,所以您不必担心这种随机发生。

+3

-1:格雷厄姆,很高兴你参与,但我看不到_ever_告诉某人编辑生成的代码。无意中使用“更新服务参考”的人不是您要与之交谈的人。这将是一些贫穷的开发人员无法知道生成的代码已被编辑。 – 2011-01-19 20:26:09

相关问题