diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 959dfe4888..bcedbeeb4f 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -60,6 +60,9 @@ + + 3.0 + 3.0 diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceCodeDomBuilder.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceCodeDomBuilder.cs index e62d7e24de..11d853cc4c 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceCodeDomBuilder.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceCodeDomBuilder.cs @@ -9,7 +9,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { public interface IServiceReferenceCodeDomBuilder { + string Namespace { get; set; } CodeCompileUnit GenerateCompileUnit(MetadataSet metadata); - } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomBuilder.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomBuilder.cs index db3b3f727d..c7b2bf89af 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomBuilder.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceCodeDomBuilder.cs @@ -3,17 +3,25 @@ using System; using System.CodeDom; +using System.Runtime.Serialization; +using System.ServiceModel.Channels; using System.ServiceModel.Description; namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { public class ServiceReferenceCodeDomBuilder : IServiceReferenceCodeDomBuilder { + public ServiceReferenceCodeDomBuilder() + { + this.Namespace = String.Empty; + } + + public string Namespace { get; set; } + public CodeCompileUnit GenerateCompileUnit(MetadataSet metadata) { - var importer = new WsdlImporter(metadata); - var contractGenerator = new ServiceContractGenerator(); - contractGenerator.Options = ServiceContractGenerationOptions.ClientClass; + ServiceContractGenerator contractGenerator = CreateServiceContractGenerator(); + WsdlImporter importer = CreateWsdlImporter(metadata); foreach (ContractDescription contract in importer.ImportAllContracts()) { contractGenerator.GenerateServiceContractType(contract); @@ -21,5 +29,25 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference return contractGenerator.TargetCompileUnit; } + + WsdlImporter CreateWsdlImporter(MetadataSet metadata) + { + var importer = new WsdlImporter(metadata); + var contractImporter = new XsdDataContractImporter(); + contractImporter.Options = new ImportOptions(); + contractImporter.Options.Namespaces.Add("*", Namespace); + importer.State.Add(typeof(XsdDataContractImporter), contractImporter); + return importer; + } + + ServiceContractGenerator CreateServiceContractGenerator() + { + var contractGenerator = new ServiceContractGenerator(); + contractGenerator.Options = + ServiceContractGenerationOptions.ClientClass | + ServiceContractGenerationOptions.ChannelInterface; + contractGenerator.NamespaceMappings.Add("*", Namespace); + return contractGenerator; + } } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs index 07b30a0d75..16cbad416a 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs @@ -52,6 +52,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference ServiceReferenceFileName referenceFileName = project.GetServiceReferenceFileName(Namespace); CreateFolderForFileIfFolderMissing(referenceFileName.Path); + fileGenerator.ServiceReferenceNamespace = Namespace; fileGenerator.GenerateProxyFile(metadata, referenceFileName.Path); ServiceReferenceMapFileName mapFileName = project.GetServiceReferenceMapFileName(Namespace); diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs index bc1e405b51..13df4ba05e 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs @@ -26,7 +26,10 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference this.codeDomBuilder = codeDomBuilder; } - public string ServiceReferenceNamespace { get; set; } + public string ServiceReferenceNamespace { + get { return codeDomBuilder.Namespace; } + set { codeDomBuilder.Namespace = value; } + } public void GenerateProxyFile(MetadataSet metadata, string proxyFileName) { diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs index 10be3a2bb1..d81ce68960 100644 --- a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs @@ -188,5 +188,19 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences generator.AddServiceReference(metadata); } + + [Test] + public void AddServiceReference_GeneratesServiceReference_NamespaceSetOnProxyGenerator() + { + CreateGenerator(); + AddProxyFileNameForServiceName("MyServiceRef"); + ServiceReferenceMapFileName expectedMapFileName = + AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + generator.Namespace = "MyServiceRef"; + + generator.AddServiceReference(metadata); + + Assert.AreEqual("MyServiceRef", fakeProxyGenerator.ServiceReferenceNamespace); + } } } diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs index c44305f56e..0201a7ce68 100644 --- a/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs @@ -48,5 +48,17 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences fakeCodeDomProvider.AssertWasCalled(p => p.GenerateCodeFromCompileUnit(compileUnit, expectedProxyFileName)); } + + [Test] + public void GenerateProxyFile_ProxyToBeGeneratedForMetadata_NamespaceUsedWhenGeneratingCodeDom() + { + CreateProxyGenerator(); + CreateCompileUnitToReturnFromCodeDomBuilder(metadata); + proxyGenerator.ServiceReferenceNamespace = "Test"; + + proxyGenerator.GenerateProxyFile(metadata, "Reference.cs"); + + Assert.AreEqual("Test", fakeCodeDomBuilder.Namespace); + } } }