如何覆盖或向单独类中的方法添加属性,以便刷新 WCF 服务不会影响我的更改?

发布时间:2021-03-04 19:10

我使用代理包装了许多 WCF 服务,并且我为每个服务使用自动生成的合同类。

我看到有一些存根(例如 static partial void ConfigureEndpoint)可以放在一个单独的类中,但是我做了其他合同更改,当我更新/刷新 WCF 服务时这些更改会被吹走。对于某些上下文,我对 C#/ASP.NET-Core 非常陌生。

合同中的示例更改如下,我添加了一个属性来默认公司...如何通过 WCF 刷新以某种方式保留此属性?

    [DefaultValue(Constants.DefaultCompany), Required] // I added this because I want to default a company
    public string Company
    {
        get
        {
            return this.companyField;
        }
        set
        {
            this.companyField = value;
        }
    }

我所做的另一个示例更改是将此方法的 public 更改为 internal,因为我不希望它在 Swagger 中显示并且该字段是一个常量。当我刷新 WCF 时,它返回为 public

    internal string PartitionKey // I changed public to internal
    {
        get
        {
            return this.partitionKeyField;
        }
        set
        {
            this.partitionKeyField = value;
        }
    }
回答1

假设您添加了一个服务引用,并且 Visual Studio 生成了一个名为 MyServiceClient 的代理。它可能看起来像这样:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class MyServiceClient : System.ServiceModel.ClientBase<MyService>
{

如您所见,如果您修改 MyServiceClient,您的修改将在您刷新服务引用时被覆盖。为了解决这个问题,不要直接修改它。相反,将其子类化。

public class MyModifiedServiceClient : MyServiceClient
{
    //Make changes here
}

现在在您的 c# 的其余部分中,不要使用 MyServiceClient,而是始终使用 MyModifiedServiceClient。刷新服务引用时,派生类不会被覆盖。