通过Web服务引用丢失了分部类

本文关键字:Web 服务 引用 通过 | 更新日期: 2023-09-27 18:29:47

我有一个Web服务项目(旧的asmx技术),其中有一个类User。这个类有一个DateTime属性,它表示这个用户的出生日期。除了这个类,我还有另一个带有分部类User的文件。在这个分部类中,我添加了一个属性"Age",它返回用户的年龄:

public partial class User
{
    public DateTime Age
    {
        get { return DateTime.Now - this.Birthdate; }
    }
}

之所以它在分部类中,是因为User类代码是从配置文件中自动生成的,每次生成代码时,如果不删除它,我就无法将代码添加到此类中。

现在,在我的Web服务中,我有一个Web方法,它从数据库中返回这些用户的列表:

[WebMethod]
public List<User> GetUsers()
{
    return Database.LoadUsers();
}

很简单。。。无论如何,现在在另一个项目中,我为这个Web服务添加了一个服务引用。它为我生成了服务客户端和一个User类。问题是:这个User类不包含分部类中定义的属性(本例中为Age)。。。网络服务似乎没有得到这些信息。

当然,我可以创建一个新的部分User类,并基本上在第二个项目中重写它,但我不应该这样做,是吗?为什么Web服务不识别分部类?

通过Web服务引用丢失了分部类

分部类不是扩展方法。它们在每个程序集中被编译成一个类。你有两个选择你想做什么:

选项1

将您编写的分部类添加为新项目的链接。它将是同一个文件,但链接到新项目中。当您进入添加->现有项目时,通过打开选择箭头,然后选择"添加为链接"。

选项2

创建一个扩展方法:

public static class DateExtensions
{
    public TimeSpan GetAge(this DateTime birthDate)
    {
        return DateTime.Now - birthDate;
    }
}

然后,只需为扩展类所在的任何命名空间添加一个using语句,并确保引用了项目/程序集,就可以调用以下语句:

// This is your BirthDate property that would come back and is DateTime
var birthDate = new SomeService().DoSomething().BirthDate;
var age = birthDate.GetAge();

选项3

创建一个单独的项目,并将服务引用和分部放在其中。使用项目引用中的项目(以及必要的框架引用)。

我创建了一个示例供您在GitHub上查看/使用。

如果必须将客户端与服务紧密耦合,则可以获得服务引用以重用服务使用的相同类型。只需将有问题的类型移动到它们自己的项目和程序集,并从客户端和服务器项目中引用它们。

我犹豫的是,这适用于WCF服务,但我从未使用ASMX服务。