我有一个webservice项目(旧的asmx技术),我有一个类User。此类具有DateTime属性,该属性表示此用户的生日。除了这个类之外,我还有另一个带有部分类User的文件。在这个部分类中,我添加了一个属性'Age',它返回用户的年龄:
public partial class User
{
public DateTime Age
{
get { return DateTime.Now - this.Birthdate; }
}
}
这是部分类的原因是因为User类代码是从配置文件自动生成的,并且我不能在每次生成代码时都不删除代码而不删除它。
现在在我的网络服务中,我有一个webmethod,它返回从数据库中获取的这些用户的列表:
[WebMethod]
public List<User> GetUsers()
{
return Database.LoadUsers();
}
足够简单......无论如何,现在在一个不同的项目中,我为这个Web服务添加了一个服务引用。它为我生成服务客户端和User类。问题是:此User类不包含在partial类中定义的属性(在此示例中为Age)...似乎webservice没有获取此信息。
当然我可以创建一个新的部分User类,并基本上在第二个项目中重写它,但我不应该,我应该吗?为什么web服务不识别部分类?
答案 0 :(得分:3)
部分类不是扩展方法。它们在每个程序集中一起编译成一个类。您有两种选择:
选项1
Add the partial class you wrote as a link到新项目。它将是同一个文件,但链接到新项目中。当你去Add - &gt;现有项目,通过打开选择箭头,然后选择“添加为链接”。
选项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
创建一个单独的项目并将服务引用和部分放在其中。使用项目从引用项目(以及必要的框架引用)。
答案 1 :(得分:0)
如果必须将客户端与服务紧密耦合,那么您可以使用服务引用来重用服务使用的相同类型。只需将有问题的类型移动到他们自己的项目和程序集中,并从客户端和服务器项目中引用它。
我的犹豫是,这适用于WCF服务,但我从未使用ASMX服务。