На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> DataContract'ные функции , WCF
    Здрасьте, господа-специалисты.

    Допустим у меня есть класс в сервисе

    ExpandedWrap disabled
      [DataContract]
      public class Foo
      {
         [DataMamber]
         public int Value {get; set;}
       
         public int Modify(int _koof)
         {
             return Value * _koof;
         }
      }


    На стороне клиента функции Modify не будет. Так вот и вопрос - с каким бубном нужно плясать вокруг монитора с открытой студией, чтобы эта функция появилась на клиенте при референсе на этот сервис?
    Сообщение отредактировано: Ozz -
      Я думаю)), реализация методов не должна передаватся на клиент в DataContract. В том то и суть, что это DATA contract.
      Если действительно так необходимо реализовать метод на клиентской и на серверной стороне, я бы, наверное, поступил следующим образом:

      1. Вынести интерфейс этого custom обьекта:
      ExpandedWrap disabled
        public interface IFoo
        {
            int Value{ get; set;}
        }
         
        public class Foo : IFoo
        {
            public int Value{ get; set;}
        }


      2. Очевидно, что в другой сборке, нужно определить public static class с extension методом:
      ExpandedWrap disabled
        public static class FooManager
        {
            public static int GetValue(this IFoo foo, int coef)
            {
                return foo.Value * coef;
            }
        }

      (по ходу интерфейс нужно тоже будет определить в этой сборке)

      3. Так как на клиенте генерируются PARTIAL классы, просто наследуешь вторую половинку partial класса от интерфейса (реализация интерфейса уже лежит в первой половинке, то есть в сгенеренном классе)
      ExpandedWrap disabled
        public partial class Foo : IFoo
        {
        }


      4. Ну и, как на серверном, так и на клиентском коде вызываешь extension метод IFoo, соответственно подключив namespace статического класса FooManager:
      ExpandedWrap disabled
        //server
        var foo = new Foo();
        int value = foo.GetValue(0);
         
        //client
        using(var proxy = new DataServiceClient())
        {
            var foo = proxy.GetFoo();
            int value = foo.GetValue(0);
        }


      Ну и, конечно, соответственным образом нужно подключить референсы на сборку с интерфейсом и статическим классом.

      Может решение конечно не самое гибкое, но все же лучше, чем с бубном танцевать :)
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0314 ]   [ 15 queries used ]   [ Generated: 17.05.24, 12:10 GMT ]