Если вы не понимаете, что такое WCF и зачем оно нужно, то, наверное, следует прочитать первую статью цикла: Основы разработки WCF-служб. Часть 1. Теория WCF.
Для того чтобы приступить к созданию первого WCF-сервиса, необходимо создать обычное консольное приложение. Конечно, это совсем не обязательно, однако отладка WCF-службы сопряжена с рядом неудобств, поэтому проще всего создать готовый, работоспособный код в обычном приложении, а потом переносить его уже в код службы. Поэтому установим задачу первой работы.
Задача: Разработать приложение, которое хранит данные о списке книг. Книга содержит название, автора, внутренний идентификационный номер и комментарии. Список книг можно просматривать и редактировать: удалять и добавлять книги.
Для начала необходимо разработать примерную структуру программы. Так как работа в консольной программе связана с начальной статичной процедурой "static void Main", то предлагается работать в ней с экземпляром класса "public class WorkBook", который будет содержать как список книг, так и набор процедур для управления этим списком. Саму книгу будет описывать класс "public class Book".
1. Создание проекта консольного приложения.
Для начала необходимо открыть среду программирования Microsoft Visual Studio8. В ней щелкните по меню "Файл":"Создать":"Проект".
Появится диалоговое окно создания нового проекта. В правой части окна, в иерархическом списке выберите тип проекта "Visual C#": "Windows".
Из набора шаблонов в правой части экрана выберите "Консольное приложение".
В нижней части окна необходимо задать имя и расположение объекта. В качестве имени введите "a_console" (с подчеркиванием) и расположите где угодно.
Нажмите "ОК".
2. Знакомство с программой.
Итак, мы создали проект. Это значит, что среда разработки Microsoft Visual Studio 2008 создала все необходимые файлы в указанном вами месте и даже приготовила черновик кода программы. Этот черновик, кстати, вам сразу же будет показан на экране. Выглядеть он должен примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 | using System; // 1 using System.Collections.Generic; // 2 using System.Linq; // 3 using System.Text; // 4 namespace a_console // 5 { class Program // 6 { static void Main(string[] args) // 7 { } } } |
Разберемся, что означает код.
Первые четыре строчки, с 1 по 4, это подключение необходимых пространств имен, отвечающих за реализацию различных, вспомогательных функций. В принципе, строки 3 и 4 для наших целей будут не нужны и можно их вообще удалить.
Строка 5 определяет пространство имен "a_console", то есть такого же имени, как и наша программа. Строка 6 вводит класс "Program" в пространстве имен "a_console". В строке 7 начинается процедура "Main", которая в нашем консольном приложении будет "точкой входа", с которой начнется выполнение всей программы.
Перед тем, как начать работать по заданию, попробуем немного модифицировать и скомпилировать программу.
В фигурных скобках, принадлежащих процедуре "Main", напишите две строчки:
1 2 | Console.WriteLine("Привет, Мир!"); Console.ReadLine(); |
Таким образом, должен получиться вот такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace a_console { class Program { static void Main(string[] args) { Console.WriteLine("Привет, Мир!"); Console.ReadLine(); } } } |
Разберемся, что означают добавленные строки. Строка Console.WriteLine("Привет, Мир!"); выводит на экран текст "Привет, Мир!", а строка Console.ReadLine(); ждет нажатия любой клавиши, чтобы закрыть программу.
Для того, что скомпилировать программу, в меню "Построение" выберите "Построить решение". Среда разработки постарается скомпилировать ваш код в исполняемое приложение (exe-приложение). Если все пройдет удачно, то в нижней части экрана вы должны увидеть подобное сообщение:
Главное, что "успешно и без изменений: 1". Если такого замечания нет, значит, ваша программа не смогла скомпилироваться из-за ошибок.
Для того, чтобы запустить программу, в меню "Отладка" выберите "Начать отладку". Откроется ваше приложение с текстом "Привет, Мир!".
Закройте приложение или в меню "Отладка" выберите "Остановить отладку".
3. Разработка необходимых классов и процедур.
Добавим класс Book в пространство имен "a_console".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | namespace a_console { public class Book { public int id; public string name; public string author; public string comments; public DateTime create; } class Program { static void Main(string[] args) { Console.WriteLine("Привет, Мир!"); Console.ReadLine(); } } } |
Класс "Book" включает 5 переменных: id (Внутренний числовой идентификатор книги), name (название книги), author (автор книги), comments (комментарии к книге), create (время, когда была создана запись о книге). Этот класс является описателем книги.
Добавим класс "WorkBook" в пространство имен "a_console".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | namespace a_console { public class Book { public int id; public string name; // Название книги public string author; // Автор книги public string comments; // Комментарии к книге public DateTime create; } public class WorkBook { public int global_id=0; public List books = new List(); public List GetBooks() { return books; } public void AddBooks(Book kniga) { global_id++; kniga.id = global_id; books.Add(kniga); } public void DelBook(int id) { books.Remove(books.Find(e => e.id.Equals(id))); } } class Program { static void Main(string[] args) { Console.WriteLine("Привет, Мир!"); Console.ReadLine(); } } } |
Давайте разберемся, что было добавлено.
В классе WorkBook содержится переменная global_id, которая является обыкновенным счетчиком количества книг.
Строчка public List books = new List(); инициализирует коллекцию List для хранения набора экземпляров класса Book. По сути, коллекция – это массив экземпляров класса с куда более широкими возможностями для манипуляции. Новый экземпляр коллекции был назван "books".
Функция public List GetBooks() возвращает коллекцию книг, которую хранит экземпляр класса WorkBook. Иначе говоря, при вызове функции List GetBooks() она должна вернуть список всех записей о книгах, что есть у программы. Список передается в формате коллекции.
Функция public void AddBooks() ничего не возвращает, но выполняет важную работу. Увеличивает счетчик global_id на 1, присваивает переданной ей книге порядковый номер (значение этого счетчика) и добавляет книгу в коллекцию (в список).
Функция public void DelBook() удаляет книгу с идентификатором, который ей передает пользователь.
Таким образом, мы добавили в программу все необходимые процедуры для работы со списком книг.
Если построить решение и запустить отладку, программа должна написать "Привет, Мир!". Как и в прошлый раз, ничего нового, к сожалению, она пока делать не может.
4. Обработка запросов пользователя.
Приступим к последнему шагу консольной программы: модифицируем процедуру Main.
Вместо
1 2 3 4 5 | static void Main(string[] args) { Console.WriteLine("Привет, Мир!"); Console.ReadLine(); } |
Запишем
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | static void Main(string[] args) { WorkBook workbook = new WorkBook(); int global_id=0; string action = "0"; Console.WriteLine("Добрый день!"); while (action != "4") { Console.WriteLine( "Что вы хотите сделать:\n" + "1 - Добавить запись о книге\n" + "2 - Просмотреть все записи\n" + "3 - Удалить запись\n" + "4 - Выход\n" ); action = Console.ReadLine(); if (action == "1") { Book kniga = new Book(); Console.WriteLine("Введите название книги"); kniga.name = Console.ReadLine(); Console.WriteLine("Автора книги"); kniga.author = Console.ReadLine(); Console.WriteLine("Введите комментарии к книге"); kniga.comments = Console.ReadLine(); kniga.create = DateTime.Now; workbook.AddBooks(kniga); Console.WriteLine("Книга добавлена!"); } else if (action == "2") { Console.Clear(); List spisok = workbook.GetBooks(); if (spisok.Count > 0) { foreach (Book book in spisok) { Console.WriteLine("№" + book.id + " : " + book.name + " \n"); } } else { Console.WriteLine("Книг в базе данных нет!\n"); } } else if (action == "3") { Console.WriteLine("Книгу с каким номером удалить?"); string id = Console.ReadLine(); workbook.DelBook(Convert.ToInt32(id)); } } Console.WriteLine("До свидания!"); Console.ReadLine(); } |
Разберемся, что было изменено. Процедура "Main" теперь выполняет ряд важных функций:
1. Инициализирует экземпляр класса "WorkBook", который будет назван workbook, строчкой:
WorkBook workbook = new WorkBook();
2. Инициализирует строковую переменную action, которая будет хранить введенные пользователем команды.
3. Выводит приглашение программы "Добрый день".
4. Инициализирует условно-бесконечный цикл while c условием. Условие говорит о том, что while будет выполняться до тех пор, пока "action" не станет равным "4", то есть пока пользователь не введет "4" с клавиатуры.
5. Внутри цикла while программа в первую очередь публикует свое меню "Что вы хотите сделать?", которое состоит из 4 действий. Так как цикл работает бесконечно, программа после каждого своего действия будет снова и снова выводить меню, пока пользователь ее не остановит.
6. Далее программа считывает в переменную action команду пользователя.
7. Если action равен "1", то программа:
a. Создает экземпляр класса Book, который называется kniga
b. Поочередно заполняет новый экземпляр kniga необходимыми значениями. Сначала он заполняет ее id исходя из значения global_id, затем просит пользователя ввести название книги, автор и комментарии к ней.
c. Помечает дату создания книги как текущую строчкой
d. kniga.create = DateTime.Now;
e. Вызывает процедуру AddBooks(), которая, как уже говорилось, добавляет книгу в коллекцию.
f. Выводит сообщение о том, что книга успешно добавлена.
8. Если action равен "2", то программа выводит список книг. Для этого она запрашивает список книг в переменную spisok через процедуру GetBooks() строчкой
List spisok = workbook.GetBooks();
9. Затем, если количество книг больше 0, то она выводит в цикле номер и название каждой книги списка.
10. Если же количество книг нулевое, то оно выводит сообщение "Книг в базе данных нет!"
11. Если action равен "3", то программа спрашивает у пользователя номер удаляемой книги и вызывает процедуру DelBook(int id), которая удаляет книгу из коллекции.
12. После выхода из главного условно-бесконечного цикла while программа выводит прощальные слова "До свидания" и закрывается.
Отметим, что в этой программе нет работы с файлами, поэтому все функции работы с бизнес-логикой и уровнем данных сосредоточены в классе WorkBook. Уровень представления сосредоточен в процедуре Main. Это очень важно для дальнейшей работы со службой.
Если построить решение и запустить отладку, программа должна выполнять все функции задания.
Разработка WCF-службы по созданному коду рассматривается в следующей статье: Основы разработки WCF-служб. Часть 3. Разработка простой WCF-службы.