Reuse types in current assembly for WCF Proxies

后端 未结 3 943
半阙折子戏
半阙折子戏 2020-12-30 08:15

VS WCF integration has nice option \"Reuse types in refrenced assemblies\". The problem is that I need the same but for the current assembly. Some of the types are already d

3条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-30 08:55

    I had the same problem, whereby I wanted a test harness to point to a couple of services. Each service would have datacontracts in common.

    What needs to be done:

    1. Use svcutil with /t:metadata on each url.
    2. Rename all the generated files with something unique for the service (e.g. Rename lala.xsd to 1_lala.xsd)
    3. Copy all generated files to a single location
    4. Use svcutil with *.xsd .wsdl /out:output.cs /namespace:,MySpecialNamespace to generate ALL service contracts and datacontracts to a single file.

    If you want to be crafty: use the following T4 template:

    <#@ template language="C#v4.0" hostspecific="True"#>
    <#@ import namespace="System.Diagnostics" #>
    <#@ import namespace="System.IO" #>
    <#=GetGeneratedCode(
    "http://localhost/Service/Service1.svc",
    "http://localhost/Service/Service2.svc",
    "http://localhost/Service/Service3.svc",
    "http://localhost/Service/Service4.svc"
    )#>
    <#+
    const string _svcutil = @"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\svcutil.exe";
    
    private string GetGeneratedCode(params string[] urls)
    {
        var tmp = GetTemporaryDirectory();
        foreach (var url in urls)
        {
            GetMetadata(url, tmp);
        }
    
        RunSvcutil(tmp, "*.wsdl *.xsd /out:output.cs /namespace:*," +     Path.GetFileNameWithoutExtension(Host.TemplateFile));
        var result = File.ReadAllText(Path.Combine(tmp, "output.cs"));
        return result;
    }
    
    private static void RunSvcutil(string workingFolder, string arguments)
    {
        var processInfo = new ProcessStartInfo(_svcutil);
        processInfo.Arguments = arguments;
        processInfo.WorkingDirectory = workingFolder;
    
        var p = Process.Start(processInfo);
        p.WaitForExit();
    }
    
    private static void GetMetadata(string url, string destination)
    {
        var workingFolder = GetTemporaryDirectory();
        RunSvcutil(workingFolder, string.Format("/t:metadata \"{0}\"", url));
    
        foreach (var filename in Directory.GetFiles(workingFolder))
        {
            File.Copy(filename, Path.Combine(destination,     Path.GetFileNameWithoutExtension(url) + "_" +  Path.GetFileName(filename)));
        }
    }
    
    private static string GetTemporaryDirectory()
    {
        string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
        Directory.CreateDirectory(tempDirectory);
        return tempDirectory;
    }
    #>   
    

提交回复
热议问题