При обновлении с asmx до wcf каждый элемент должен быть украшен атрибутом DataMember? - PullRequest
2 голосов
/ 17 июня 2011

У меня есть веб-сервис, который в настоящее время использует asmx.Операции украшены WebMethod, и каждая получает запрос и возвращает ответ.Я начал создавать приложение WCF и ссылаюсь на бизнес-уровень, чтобы можно было повторно использовать веб-методы.Мой вопрос заключается в том, должен ли я украшать каждый класс с помощью DataContract, а каждое свойство запроса с помощью DataMember?

В настоящее время один из классов украшен SerializableAttribute, XmlTypeAttribute и XmlRootAttribute.Нужно ли удалять их и добавлять DataContract или я могу добавить к ним DataContract?Кстати, это приложение .NET 2.Класс также содержит несколько закрытых полей и открытых свойств, нужно ли мне их украшать атрибутом DataMember.Возможно ли это, даже если используется платформа .NET 2?

Служба WCF в настоящее время ориентирована на .NET Framework 4.0.Некоторые методы все еще должны использовать XmlSerializer, так значит ли это, что я могу просто декорировать операцию с помощью [XmlSerializerFormat]?

Можете ли вы уточнить, не используете ли какие-либо бизнес-объекты на границе службы?а что такое DTO?

Если можно, можете привести пример?

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Начиная с .NET 3.5 SP1 DataContractSerializer не требует использования атрибутов (называемых поддержкой POCO).Хотя это дает вам небольшой контроль над XML, который создается

Однако, если у вас уже есть служба ASMX, которую вы хотите портировать, тогда сохраняйте ту же сериализацию, которую вы действительно хотите использовать XmlSerializer.Вы можете подключить это в WCF с помощью атрибута [XmlSerializerFormat], который можно применять на контракте на обслуживание или на уровне отдельной операции

Редактировать: добавление раздела в DTO

Однакоразмещение бизнес-объектов на границах сервисов может привести к потенциальным проблемам:

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

Идея объектов передачи данных (DTO) заключается в создании классов, единственная роль которых в жизни состоит в управлении переходом между XML и объектным миром.Это также соответствует принципу единой ответственности .DTO, как правило, предоставляют необходимые данные и служат буфером между изменениями в бизнесе и форматом передачи.Вот пример

[ServiceContract]
interface ICustomer
{
    [OperationContract]
    CustomerDTO GetCustomer(int id);
}

class CustomerService : ICustomer
{
    ICustomerRepository repo;
    public CustomerService (ICustomerRepository repo)
    {
        this.repo = repo;
    }

    public CustomerService()
        :this(new DBCustomerRepository())
    {

    }

    public CustomerDTO GetCustomer(int id)
    {
        Customer c = repo.GetCustomer(id);
        return new CustomerDTO
        {
            Id = c.Id,
            Name = c.Name,
            AvailableBalance = c.Balance + c.CreditLimit,
        };
    }
}

class Customer
{
    public int Id { get; private set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public decimal Balance { get; set; }
    public decimal CreditLimit { get; set; }      
}

[DataContract(Name="Customer")]
class CustomerDTO
{
    [DataMember]
    public int Id { get; private set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public decimal AvailableBalance { get; set; }
}

Использование DTO позволяет вам раскрыть существующую бизнес-функциональность через сервисы без необходимости вносить изменения в эту бизнес-функциональность по чисто техническим причинам

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

0 голосов
/ 18 июня 2011

WCF использует DataContractSerializer, который в основном основан на таких атрибутах, как: DataContract, DataMember, ServiceContract и так далее. Но он также поддерживает SerializableAttribute среди других. Этот http://msdn.microsoft.com/en-us/library/ms731923.aspx документ дает вам всю необходимую информацию.

Возможно, вам не нужно реорганизовывать весь существующий код, но это требует дальнейшего изучения и тестирования;)

...