Как использовать ваши доменные объекты через .Net веб-сервис? - PullRequest
1 голос
/ 27 февраля 2009

, если у вас есть объект, который является ссылкой в ​​клиенте, и веб-сервис, подобный этому

public class Post
{    
        public int ID {get; set;}
        string Data {get; set;}
}



 public class MyService: System.Web.Services.WebService
 {   
         [WebMethod]
         public int Write (Post post)
         { 
               //Do stuff

         }
 }

на клиенте, чтобы использовать объект, который вы создаете в прокси-классе

   public void ClientMethod()
      {
         var post = new proxyclass.Post();
         //fill post
         new ProxyClass.Myservice().Write(post) 

       }

как я могу использовать свой домен для вызова веб-службы?

 public void ClientMethod()
          {
             var post = new Post();
             //fill post
             new ProxyClass.Myservice().Write(post) 

           }

Ответы [ 4 ]

2 голосов
/ 27 февраля 2009

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

Вы можете использовать отражение (и т. Д.), Чтобы скопировать свойства между объектами вашего домена и прокси-серверами, но довольно сложно сделать это на 100% правильным (хотя сериализация xml должна работать [теоретически] как промежуточный язык).


Итак, если вы хотите использовать совместное использование сборки; рассмотрите возможность использования WCF, который поддерживает это; -p

Чтобы получить доступ к сервису без использования прокси-слоя, вы можете выполнять такие приемы, как:

public class WcfClient<T> : ClientBase<T> where T : class
{
    public T Service { get { return base.Channel; } }
}

(это позволит получить доступ к конфигурации по умолчанию из app.config; для большего контроля необходимо добавить несколько перегрузок конструктора, соответствующих базовым перегрузкам конструктора)

Тогда:

interface IFoo {void Bar();}
...
using(WcfClient<IFoo> client = new WcfClient<IFoo>()) {
    client.Service.Bar();
}
1 голос
/ 27 февраля 2009

Вы должны использовать WCF для новых разработок, когда это возможно.

Однако вам следует пересмотреть причины, по которым вы хотите использовать класс вашего домена на клиенте. Это нарушает принципы SOA, раскрывая клиенту некоторые детали реализации сервиса. Почему клиент должен знать что-либо о ваших классах сущностей, помимо данных, которые они содержат?

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

Кроме того, одним из принципов SOA является взаимодействие с различными платформами. Как только вам требуется, чтобы ваш клиент использовал вашу сущность (.NET), вы не позволяете клиенту Java или PHP писать для использования вашей службы.

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

1 голос
/ 27 февраля 2009

Взгляните на эту статью: http://www.codeproject.com/KB/WCF/WCFCollectionTypeSharing.aspx (Совместное использование типов коллекции WCF между службой и клиентом)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...