Как использовать пользовательские атрибуты через веб-сервис? - PullRequest
0 голосов
/ 16 июня 2010

В настоящее время я пытаюсь добавить собственное «имя столбца» к свойству в веб-службе. Вот мой класс.

public class OrderCost
{ 
    public int OrderNum { get; set; }
    public int OrderLine { get; set; }       
    public int OrderRel { get; set; }
    public DateTime OrderDate { get; set; }
    public string PartNum { get; set; }
    public string Description { get; set; }
    public decimal Qty { get; set; }
    public string SalesUM { get; set; }
    public decimal Cost { get; set; }
    public decimal Price { get; set; }
    public decimal Net { get; set; }
    public decimal Margin { get; set; }
    public string EntryPerson { get; set; }
    public string CustID { get; set; }
    public string Customer { get; set; }
}

По сути, у меня есть другой класс (на стороне Silverlight), который перебирает все свойства и создает столбец для каждого свойства. Дело в том, что я хочу использовать другое имя, отличное от имени свойства. Например, я хотел бы показать «Номер заказа» вместо OrderNum. Я пытался использовать пользовательские атрибуты, но это не похоже на работу. Есть ли способ, которым я могу предоставить другое имя для этих свойств через веб-сервис с использованием атрибута? Есть ли другой способ добиться того, что я пытаюсь сделать?

Ответы [ 2 ]

0 голосов
/ 19 июня 2010

Нет, между клиентом и службой нельзя использовать ни атрибуты, ни что-либо другое, специфичное для .NET. См. « Основы: как работают веб-сервисы », чтобы узнать, почему нет.

0 голосов
/ 16 июня 2010

Если то, что вы ищете, это способ управления этими метаданными на сервере без обновления клиентских приложений, то я не думаю, что атрибуты - это решение. С одной стороны, атрибуты определяются во время компиляции, и я не думаю, что вы должны манипулировать ими во время выполнения, даже если у вас есть возможность сделать это. Однако другая проблема заключается в том, что веб-сервисы на самом деле не имеют собственного механизма, соответствующего атрибутам .Net, поэтому нет встроенного способа передачи метаданных, которые представляют эти атрибуты.

Если вы действительно хотите, чтобы эти метаданные определялись с помощью атрибутов, вы могли бы поместить свой класс OrderCost в отдельную общую сборку для использования как веб-службой, так и клиентскими приложениями. Недостатком здесь является то, что если вы хотите изменить значения, которые вы определили в своих атрибутах, то клиентские приложения не увидят эти изменения, пока не получат обновленную DLL.

В качестве альтернативы, если вы хотите, чтобы клиентские приложения полностью не знали о каких-либо изменениях метаданных, то я бы подумал о создании какого-либо класса Display, который содержит требуемую отображаемую информацию и возвращается как часть результата .

Например, приведенный ниже код показывает класс с именем MyResultObject, который содержит один объект «Display» и список объектов «Data». Очевидно, что пространства имен, имена классов и организация этих классов зависит от вас:

namespace MyApplication
{
    public class MyResultObject
    {
        public Display.OrderCost Display { get; set; }

        public IList<Data.OrderCost> Data { get; set; }
    }
}

namespace MyApplication.Display
{
    public class Column
    {
        public string HeaderText { get; set; }
        public bool Visible { get; set; }
    }

    public class OrderCost
    {
        public Column OrderNum { get; set; }
        public Column OrderLine { get; set; }
        public Column OrderRel { get; set; }
        public Column OrderDate { get; set; }
        public Column PartNum { get; set; }
        public Column Description { get; set; }
        public Column Qty { get; set; }
        public Column SalesUM { get; set; }
        public Column Cost { get; set; }
        public Column Price { get; set; }
        public Column Net { get; set; }
        public Column Margin { get; set; }
        public Column EntryPerson { get; set; }
        public Column CustID { get; set; }
        public Column Customer { get; set; }
    }
}

namespace MyApplication.Data
{
    public class OrderCost
    {
        public int OrderNum { get; set; }
        public int OrderLine { get; set; }
        public int OrderRel { get; set; }
        public DateTime OrderDate { get; set; }
        public string PartNum { get; set; }
        public string Description { get; set; }
        public decimal Qty { get; set; }
        public string SalesUM { get; set; }
        public decimal Cost { get; set; }
        public decimal Price { get; set; }
        public decimal Net { get; set; }
        public decimal Margin { get; set; }
        public string EntryPerson { get; set; }
        public string CustID { get; set; }
        public string Customer { get; set; }
    }
}

Я думаю, что вы должны спросить себя, хотя, имеет ли смысл для службы иметь какие-либо знания о том, как будут отображаться ее данные. И наоборот, имеет ли смысл для клиента использовать данные, которые он не понимает, так что ему нужны метаданные для правильной обработки этих данных? В некоторых случаях это может быть именно тем, что вы хотите сделать, но, вероятно, не в общем случае, я думаю. В любом случае, вам решать, каков правильный подход для вашего приложения.

...