如何在引用项目中隐藏Wrapper项目的ServiceReference?
解决SOAP Wrapper项目隐藏ServiceReference依赖的方法
以下是几种可行的方案,既可以隐藏内部依赖,又能避免XmlSerializer的反射问题:
1. 通过项目配置隔离依赖
编辑Wrapper项目的.csproj文件,给所有SOAP相关的依赖和ServiceReference添加PrivateAssets="All"配置,让这些资源只在Wrapper项目内部可用,不会传递给引用它的项目:
<!-- 处理NuGet包依赖 --> <ItemGroup> <PackageReference Include="System.ServiceModel.Http" Version="4.10.0" PrivateAssets="All" /> <!-- 其他SOAP相关NuGet包都加上这个配置 --> </ItemGroup> <!-- 处理项目内的ServiceReference --> <ItemGroup> <ServiceReference Include="YourServiceReference" PrivateAssets="All" /> </ItemGroup>
2. 封装公共接口,隔离内部实现
不要直接对外暴露生成的SOAP客户端类,而是自己定义公共接口和模型,内部用生成的客户端做实现:
- 定义公共接口(比如
IMyThirdPartySoapService),只包含业务需要的调用方法。 - 内部创建实现类(比如
ThirdPartySoapServiceWrapper),实现这个接口,在类中实例化生成的SOAP客户端并完成调用逻辑。 - 对外提供获取接口实例的入口(比如静态工厂方法、DI注册扩展),完全隐藏内部的SOAP客户端和ServiceReference类型。
这种方式能彻底隔离内部实现,引用项目只能看到你定义的公共接口和模型,完全接触不到自动生成的ServiceReference内容。
3. 用InternalsVisibleTo让XmlSerializer访问内部类型
如果想把生成的SOAP类设为internal,可以通过InternalsVisibleTo特性授权XmlSerializer程序集访问这些内部类型,同时不让引用项目看到:
在Wrapper项目的.csproj中添加以下配置:
<ItemGroup> <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo"> <_Parameter1>System.Xml.Serializer</_Parameter1> </AssemblyAttribute> </ItemGroup>
这样XmlSerializer能正常反射内部类型完成序列化,而引用项目无法访问这些internal类型。
4. 预生成XmlSerializer程序集(进阶)
使用sgen.exe工具提前为生成的SOAP类生成序列化程序集,这样运行时XmlSerializer不需要反射内部类型,就能直接使用预生成的序列化代码。步骤大致如下:
- 运行
sgen.exe /assembly:YourWrapperProject.dll生成对应的序列化程序集。 - 将生成的序列化程序集和Wrapper项目一起发布/引用。
这样就能安全地把所有生成的SOAP类设为internal,同时避免反射问题。
内容的提问来源于stack exchange,提问作者DatTronGuy
相关产品推荐
相关产品推荐

