Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WCF интерфейс, слишком много методов 
:(
    Опции темы
Экскалупатор
Дата 28.1.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



всем привет. такая ситуация. есть приложение сервер и клиент к нему. они работают через WCF, соответственно в интерфейсе объявлена куча методов, по одному на каждое выполняемое клиентом действие(получить одни данные, получить другие данные, записать, проверить и пр.) и что то мне уже не нравится такое количество методов. можно ли как то уменьшить их количество, но при этом не давать клиенту информацию о реализации сервера(т.е. откуда данные берутся, что с ними на сервере происходит и пр.). подскажите в какую сторону хоть копать что бы уменьшить количество интерфейсных методов, но не потерять функциональность. у меня пока что только один способ, бровать между сервером и клиентом целые таблицы(может даже DataSet), или коллекции своих классов с сущностями таблиц. но что то методов при этом сильно меньше не становится.
PM MAIL ICQ   Вверх
jonie
Дата 28.1.2011, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Экскалупатор
Дата 28.1.2011, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Цитата(jonie @  28.1.2011,  18:36 Найти цитируемый пост)
если вы уж так захотели  - делать все одним классом

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


 да и к тому же если делать несколько интерфейсов и несколько же классов их реализующих, то как сервер будет определять к какому классу идет подключение если сервер все время слушает только один порт?

но повторюсь решение через разбиение на классы не убирает основной проблемы: сервер предоставляет много методов, многие из которых выполняют одинаковые функции, только с разными данными.
PM MAIL ICQ   Вверх
AVX
Дата 28.1.2011, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.5.2010

Репутация: нет
Всего: 1



Цитата(Экскалупатор @  28.1.2011,  20:52 Найти цитируемый пост)
в том то и дело что не хочу, надо как то упростить, вопрос больше не в том как разбить на классы, а как можно уменьшить общее количество методов. т.е. если методы выполняют одинаковую функцию(к примеру добавить данные в таблицу), то как можно реализовать добавление разных данных через один метод. да и к тому же если делать несколько интерфейсов и несколько же классов их реализующих, то как сервер будет определять к какому классу идет подключение если сервер все время слушает только один порт?но повторюсь решение через разбиение на классы не убирает основной проблемы: сервер предоставляет много методов, многие из которых выполняют одинаковые функции, только с разными данными.

Я бы сделал класс, в котором содержаться данные для методов
Код

    public class MyParam
    {
        public string Name { get; set; }

        public string Data { get; set; }
    }

И передавал бы его параметром метода в интерфейсе
Код

    public interface MyInterface
    {
        public void MyMethod(MyParam param)
        {
             //Тут вызываем метод на основании данных в param

        }
    }



А ещё лучше добавить перечисление
Код

public enum MethodKid
    {
        One,
        Two,
        Three,
        Four
    }


    public class MyParam
    {
        public string Name { get; set; }

        public string Data { get; set; }
    }

    public interface MyInterface
    {
        public void MyMethod(MethodKid kid, MyParam param)
        {
            //Выполняем тот метод, тип которого мы передали
            switch (kid)
            {
                case MethodKid.One:
                    break;
                case MethodKid.Two:
                    break;
                case MethodKid.Three:
                    break;
                case MethodKid.Four:
                    break;
                default:
                    break;
            }

        }
    }


Это сообщение отредактировал(а) AVX - 28.1.2011, 22:43
PM MAIL   Вверх
Экскалупатор
Дата 28.1.2011, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



AVX, ммм, а как быть если у меня есть 20 таблиц в базе данных и клинтскому приложению в разное время нужно работать с разными данными? мы опять вернемся к куче методов каждый из которых принимает кучу разных параметров, при этом выполняя с ними одинаковые действия.
т.е. исходя из твоего примера получается что мне нужно 20 классов MyParam1, MyParam2 и пр.(для каждой таблицы или набора данных).

Это сообщение отредактировал(а) Экскалупатор - 28.1.2011, 23:37
PM MAIL ICQ   Вверх
AVX
Дата 29.1.2011, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.5.2010

Репутация: нет
Всего: 1



Ну если га то пошло, то можно  param сделать объектом, и передавать в нём нужные вам данные, а в зависимости от kid приводить типы и выполнять действия над данными
Код

    public interface MyInterface
    {
        public void MyMethod(MethodKid kid, object param)
        {
            //Выполняем тот метод, тип которого мы передали
            switch (kid)
            {
             case MethodKid.One:
             if (param.GetType() == typeof(OneType))
             {
             OneType o = (OneType)param;
             OneMethod(o);
             }
             else
            {
              throw new Exception("Not correct type!");
            }
            //Ну и остальные так же
                    break;
                case MethodKid.Two:
                    break;
                case MethodKid.Three:
                    break;
                case MethodKid.Four:
                    break;
                default:
                    break;
            }

        }
    }


Добавлено через 4 минуты и 42 секунды
Цитата(Экскалупатор @  28.1.2011,  23:35 Найти цитируемый пост)
т.е. исходя из твоего примера получается что мне нужно 20 классов MyParam1, MyParam2 и пр.(для каждой таблицы или набора данных).


Имхо, вы должны определить более высокий абстрактный объектный слой на основе реляционной модели, и если у вас получится 20 типов данных ничего в этом страшного нет, лишь бы все они имели смысл
PM MAIL   Вверх
jonie
Дата 29.1.2011, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



AVX, ага, а придется использовать KnowTypeAttribute или NetDataContractSerializer чтобы такой аргумент wcf понимал...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0753 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.