Частичные классы потеряны из-за ссылки на веб-сервис - PullRequest
3 голосов
/ 03 апреля 2012

У меня есть проект веб-сервиса (старая технология 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();
}

Достаточно просто ... Во всяком случае, теперь в другом проекте я добавляю ссылку на сервис для этого веб-сервиса. Он генерирует сервисный клиент и класс User для меня. Проблема в том, что этот класс User не содержит свойств, определенных в частичном классе (в данном примере Age) ... Кажется, веб-служба не получает эту информацию.

Конечно, я могу создать новый частичный класс User и переписать его во втором проекте, но я не должен этого делать, не так ли? Почему веб-сервис не распознает частичный класс?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Частичные классы не являются методами расширения. Они собраны вместе в один класс в каждой сборке. У вас есть два варианта того, что вы хотите сделать:

Вариант 1

Добавьте созданный вами частичный класс в виде ссылки в новый проект. Это будет тот же файл, но связанный в новый проект. Когда вы идете в Add -> Existing Item, выберите стрелку Open и выберите «Add as 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

Создайте отдельный проект и поместите в него ссылку на сервис и частичную информацию. Ссылка на проект (и необходимые ссылки на фреймворки) из ваших с использованием проектов.

Я создал пример для просмотра / использования на GitHub .

0 голосов
/ 03 апреля 2012

Если вам необходимо жестко привязать вашего клиента к вашему сервису, вы можете получить ссылку на сервис для повторного использования тех же типов, что и сервис. Просто перенесите рассматриваемые типы в их собственный проект и сборку и ссылайтесь на них из проектов клиента и сервера.

Я сомневаюсь, что это работает со службой WCF, но я никогда не делал этого со службой ASMX.

...