【问题标题】:Partial classes lost through a webservice reference通过 Web 服务引用丢失的部分类
【发布时间】:2012-04-17 04:23:58
【问题描述】:

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

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

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

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

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

很简单...无论如何,现在在不同的项目中,我向这个 web 服务添加了一个服务引用。它为我生成服务客户端和用户类。问题是:这个 User 类不包含在部分类中定义的属性(在这个例子中是年龄)......看起来 web 服务没有得到这个信息。

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

【问题讨论】:

    标签: c# web-services asmx partial-classes


    【解决方案1】:

    部分类不是扩展方法。它们在每个程序集中一起编译成一个类。您有两种选择:

    选项 1

    Add the partial class you wrote as a link 到新项目。它将是同一个文件,但链接到新项目中。当您转到添加 -> 现有项目时,选择打开箭头并选择“添加为链接”。

    选项 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

    创建一个单独的项目并将服务引用和部分放入其中。从您的using 项目中引用项目(和必要的框架引用)。

    我创建了an example for you to view/use on GitHub

    【讨论】:

    • 选项 1 不起作用,因为部分类不再在同一个项目中(并且它无法访问实际类的属性)。选项 2 仅适用于这个简单的示例,与我的问题没有真正的关系,我不能将它用于我的实际项目。如果分部类是在程序集中一起编译的,那么为什么webservice引用看不到分部类中的属性呢?编译后它们应该在同一个类(一起编译!)?!
    • 我理解选项 2,但您在选项 1 上错了。添加为链接与将源文件复制到新项目中完全相同,除了有只有一个实际文件的单个实例,如果你在一个地方更改它,它会在所有地方更改,因为它是同一个文件。
    • 当您添加第二个服务引用时,您并没有引用程序集。您正在将新的源代码添加到您的新项目中。当您添加新引用时,代理类是一个单独的文件,因此您需要将您的部分添加为 链接。它不会是副本,而是对原始位置的引用,但它会被编译到两个项目程序集中。
    • 我做了 Chris Bernard 对选项 1 所做的事情。创建一个新文件,并确保命名空间与自动生成的 User 类相同。类名也必须相同(你的类名是,我提到这是对其他有同样问题的人的帮助)。该文件存在于我的服务代码所在的位置。在客户端项目中,我将此文件添加为链接,我的客户端代码现在具有这些额外添加的属性。这种方法的好处是这些额外的属性不一定通过网络传输,从而节省了带宽。
    • 我可能理解不正确,但是如果 webservice 项目中的 User 类和另一个项目中的(代理)User 类(我添加服务引用)不在相同的命名空间?我可以将文件添加为链接,很好,但我无法更改名称空间,因为这也会在原始位置更改它。由于代理类的命名空间是固定的(我猜?因为它是自动生成的......)我必须将命名空间更改为原始类?!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 2015-05-29
      相关资源
      最近更新 更多