Конструктор класса (из веб-службы C #) не будет автоматически реализовывать свойства в C # MVC - PullRequest
0 голосов
/ 20 января 2011

Я запускаю два экземпляра VS2010 на моей локальной машине.Один экземпляр запускает мой веб-сервис (написанный на C #).Другой экземпляр запускает мое веб-приложение MVC (также C #).У веб-приложения MVC есть ссылка на веб-сервис.Я могу успешно вызывать методы веб-сервиса из приложения MVC.

В моем веб-сервисе есть класс PageNavigation:

// PageNavigation.cs
using System;
using System.Collections.Generic;
using System.Text;

public class PageNavigation
{
    public string Page_Number { get; set; }
    public string Page_Count { get; set; }

    public PageNavigation()
    {
        Page_Number = "1";
        Page_Count = "2";
    }
}

По умолчанию этот должен возвращать объект с автоматически реализованными свойствами, когда я вызываю конструктор класса:

WebService.PageNavigation pageNavigation = new WebService.PageNavigation();

Это работает при создании объекта PageNavigation в другом месте веб-службы.

pageNavigation.Page_Number
"1"
pageNavigation.Page_Count
"2"

Однако выполнение одной и той же строки кода в MVC не дает того же результата;все свойства объекта имеют нулевые значения.

pageNavigation.Page_Number
null
pageNavigation.Page_Count
null

Это ожидаемое поведение?Есть ли способ заполнить свойства значениями по умолчанию, как предполагалось?Если потребуется дополнительная информация, пожалуйста, дайте мне знать, и я обновлю вопрос.

Ответы [ 4 ]

3 голосов
/ 20 января 2011

Сервисная ссылка видит только схему вашего объекта, а не бизнес-логику;в вашем случае ваша справочная служба только что создала тип данных оболочки в приложении MVC.Когда вы создаете ссылку на службу, она фактически создает другой тип с теми же именами и типами свойств, что и тип, определенный в службе.

Для вашего конкретного сценария (просто предоставив значения свойств по умолчанию ине более общей бизнес-логики), вы должны иметь возможность применить атрибут [System.ComponentModel.DefaultValue] к вашим свойствам, чтобы генератор классов мог распознать, что эти свойства должны быть заполнены значением по умолчанию.

Кстати, еслиссылка на службу повторно использовала существующие типы (если бы у вас был этот тип в общей библиотеке, на которую ссылались, например, служба и приложение), тогда ваша бизнес-логика была бы не повреждена.

Альтернативой может бытьреализовать шаблон фабрики, при котором в веб-службе вы вызываете функцию, которая создает (и, необязательно, заполняет) объект данных, а затем возвращает его клиенту.

1 голос
/ 20 января 2011

Если вы настаиваете на использовании одних и тех же типов между клиентом и сервисом, то на вкладке «Дополнительно» диалогового окна «Добавить ссылку на сервис» можно выбрать повторное использование типов в сборке вашего сервера.

Я бы переместил этот класс из службы в проект библиотеки классов, на который ссылается служба и клиент.

И я бы не стал этого делать по такой маленькой причине, как значения по умолчанию.это нарушает SOA, связывая сервис и клиента.Это, очевидно, не будет работать для клиентов, которые не работают .NET.

1 голос
/ 20 января 2011

Да, это ожидаемое поведение.Сайт MVC фактически не использует ваш класс PageNavigation.Это простая копия (генерируемая при добавлении ссылки на веб-службу), содержащая все свойства, но ни один из методов, включая конструктор.в отдельной сборке, а затем вы можете повторно использовать эту сборку на клиенте в качестве опции при создании прокси.

0 голосов
/ 20 января 2011

Какой сериализатор вы используете для десериализации ответа с сервера?Некоторые из них (например, DataContractSerializer) не вызывают конструктор по умолчанию.

Решение, которое следует использовать, если вы на самом деле используете DataContractSerializer, - это использоватьOnDeserialized атрибут, подобный этому:

using System.Runtime.Serialization;

public class PageNavigation
{
    public string Page_Number { get; set; }
    public string Page_Count { get; set; }

    public PageNavigation()
    {
        Init();
    }

    [OnDeserialize]
    void Init()
    {
        Page_Number = "1";
        Page_Count = "2";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...