Разработка архитектуры программной системы 'Библиотека'
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ
Разработка архитектуры программной
системы "Библиотека"
По дисциплине: Стандарты и технологии
распределенных объектных архитектур
Работу выполнил студент гр.
Басковский Д.С.
Санкт-Петербург
Содержание
Обзор существующих архитектур
Архитектура ПО
Текст программы
Выводы
Обзор
существующих архитектур
.net
Remoting
.net Remoting - это технология управляемых удаленных вызовов
между доменами приложений. Домены приложений - это единицы изоляции в CLR,
которые создаются и работают внутри процесса. Код и объекты, исполняющиеся в
одном домене приложения, не имеют непосредственного доступа к коду и объектам,
исполняемым в другом домене. Одно из главных отличий Remoting от
предшественников состоит в том, что эта технология создана для работы в
управляемой среде. Там, где раньше речь шла о процессах и взаимодействии между
ними, теперь говорится о контекстах и доменах приложений.
Web-сервисы
Web - сервисом может быть любое приложение, имеющее доступ к
Web, например, Web - страница с динамическим содержимым. В более узком смысле
Web - сервис - это приложение, которое предоставляет открытый интерфейс,
пригодный для использования другими приложениями в Web. Спецификация ONE Sun
требует, чтобы Web - сервисы были доступны через HTTP и другие Web - протоколы,
чтобы дать возможность обмениваться информацией посредством XML - сообщений и
чтобы их можно было найти через специальные сервисы - сервисы поиска. Для
доступа к Web - сервисам разработан специальный протокол - Simple Object Access
Protocol (SOAP), который представляет средства взаимодействия на базе XML для
многих Web - сервисов. Web - сервисы особенно привлекательны тем, что могут
обеспечить высокую степень совместимости между различными системами. Web -
сервисы являются одним из вариантов реализации компонентной архитектуры, при
которой приложение рассматривается как совокупность компонентов,
взаимодействующих друг с другом. Web-сервисы являются еще одной реализацией
системного программного обеспечения промежуточного слоя. Отличительной чертой
этой технологии является ее независимость от используемого программного и
аппаратного обеспечения, а также использование широко применяемых открытых
стандартов (таких как XML) и стандартных коммуникационных протоколов.
WCF
Windows Communication Foundation - это очередной фреймворк
для построения распределенных приложений и межпроцессного взаимодействия,
который является логическим развитием предыдущих подобных технологий компании
Майкрософт, в частности Веб-сервисов,.net Remoting и DCOM. И если
предшественники были заточены на выполнение какого-то конкретного круга задач,
то WCF - это скорее мультипарадигменная технология, вобравшая в себе все лучшее
от своих предшественников, добавив при этом, конечно же, кое-каких собственных
проблем. Существенным отличием WCF от.net Remoting является то, что WCF - это,
прежде всего, технология для построения сервис-ориентированной архитектуры
приложений (SOA - Service-Oriented Architecture), что позволяет
абстрагироваться от конкретной технологи, на которой этот сервис реализован и
пользоваться им из других приложений, написанных на любой другой платформе,
языке, технологии; главное, чтобы реализация клиента отвечала определенным
правилам. Кроме того, логика самого сервиса и его реализация полностью отделена
от коммуникационной составляющей, и мы можем декларативно изменять способ
взаимодействия с сервисом путем изменения конфигурационного файла. Мы можем
изменить протокол взаимодействия, адрес, настроить максимальное количество
подключений, ограничить размер пакетов и тайм-аут подключения к сервису,
тайм-аут выполнения операции, надежность доставки и многое другое. вся
инфраструктура WCF состоит из двух главных уровней: (1) Service Model Layer и
(2) Channel Layer.
CORBA
Обобщенная Архитектура построения Брокеров Объектных Запросов
разработана для поддержки интеграции самых разнообразных объектных систем.
Спецификация CORBA устанавливает принципы создания Брокеров Объектных Запросов,
которые и допускают такую интеграцию. Запрос посылается от клиента к серверу.
Клиент - это приложение, или нечто другое, выполняющее операцию над объектом, а
реализация объекта - это код и данные, которые на самом деле выполняют эту
операцию. ORB способен выполнить все действия, необходимые для нахождения
реализации указанного объекта, подготовке этой реализации к обработке запроса и
передаче данных, относящихся к запросу. Интерфейс, предоставляемый клиенту
абсолютно не зависит от местоположения реализации объекта, языка
программирования, на котором он написан или каких-либо других аспектов, не
влияющих на определение интерфейса для данного объекта. Брокер объектных
запросов, ORB - это логическое ядро, средоточие системы. Именно он позволяет
объектам посылать запросы и получать ответы от других объектов, расположенных
на той же машине или где угодно на сети. При этом в рамках данного запроса
объект-отправитель относится к клиентскому приложению, а объект-адресат - к
серверному. Роли клиента и сервера в отличие от традиционных клиент-серверных
систем не закреплены за приложениями. В другой ситуации клиент и сервер могут
поменяться местами. Понятия клиент-сервер и объект - два любимых конька
идеологии CORBA. Два последних революционных открытия в сфере компьютерных
технологий времени объединились в одном стандарте, дополнив друг друга.
Архитектура
ПО
Для разработки проектирования архитектуры
была использована трех уровневая архитектура.
Ее достоинства:
· Масштабируемость
· Конфигурируемость
· Высокая безопасность
· Высокая надёжность
Как и у любой другой архитектуры, она не лишена недостатков:
· Тяжелая разработка
· Низкая скорость работы
Рис. 1. Архитектура ПО
Рис. 2. Трехуровневая архитектура
В качестве типового решения слоя модели предметной области в проекте
используется двухэтапное представление. Достоинство двухэтапного представления
в том, что решение о варианте преобразования данных принимается в одном месте.
Это облегчает внесение глобальных изменений, поскольку для модификации
достаточно отредактировать данные единственного объекта. Типовое решение
"двухэтапное представление" хорошо проявляет себя, где в службах
используются многочисленные клиенты. (В моей предметной области - читатели).
Рис. 3. Двухэтапное представление объектов
Типовое решение "модуль таблицы" предусматривает
создание по одному классу на каждую таблицу базы данных, и единственный
экземпляр класса содержит всю логику обработки данных таблицы. предусматривает
создание сети взаимосвязанных объектов, каждый из которых представляет некую
осмысленную сущность. В ней смешиваются данные и функции, допускаются
многозначные атрибуты. создаются сети ассоциаций и используются связи
наследования. Схема базы данных простая, т.е. по одному объекту домена в расчете
на каждую таблицу. Класс VO как раз и реализует типовое решение "модуль
таблицы".
В роли слоя доступа к данным используется типовое решение
"шлюз таблицы данных" - стандартная технология доступа к базам данных
в мире WINDOWS. Считывание записей базы данных осуществляется в потоковом
режиме посредством объектов DataReader. Концепция потокового режима очень
удобна при работе с большими объемами информации, поскольку избавляет от
необходимости помещать их в оперативную память. Для записи данных используется
"шлюз записи данных". Которая включает в себя только логику доступа к
базе данных и никакой логики домена. Класс dbConnection непосредственно связан
с Базой данных, получает SQL извне Transact-SQL запросы и обрабатывает их.
Слой источник данных. Обращение к базе данных, обмен сообщениями,
управление транзакциями. Это подмножество функций, обеспечивающих
взаимодействие со сторонними системами, которые выполняют задания в интересах
приложения. Основная логика источника данных сосредоточена в коде СУБД MS SQL
Server. Класс DAO - как раз слой доступа к данным. Имеет строку подключения.
Методы Find и Create и другие. В роли СУБД используется реляционное
Transact-SQL решение от корпорации Microsoft SQL SERVER 2012. База данных
приведена к 1 нормальной форме.
архитектура приложение программное обеспечение
Рис.4. Диаграмма классов модели предметной области в UML
Рис.5. Схема типового решения представление
Рис.6. Взаимодействие со шлюзом запросов к базе данных
В роли типового решения для организации слоя "логики
распределенного приложения" используется слой web-служб. Его реализация
используется для удаленных вызовов. Слой также инкапсулирует реализацию
бизнес-логики приложения и последовательных обращений к этой логике ее
многочисленными клиентами. WebService1 - собственно сам веб-сервис. Выдает
данные полученные из класса BUS в текстовом формате.
Слой "контроллер приложения" относительно независим от выбора
форм реализации нижележащих слоев системы. Я выбрал типовое решение -
"тонкий клиент". Так как программирование интерфейса толстого клиента
требует существенно больших усилий, причем это вызвано его изощренностью, а не
какими-то внутренними технологическими трудностями. Клиентская часть приложения
построена на winforms с использованием языка общего назначения C# с добавлением
референсной ссылки на веб-сервис. Если веб-сервис работает нормально, на
клиентской стороне доступны такие возможности как: добавление/удаление
пользователя, добавление/удаление/обновление текущего списка литературы. Кроме
того возможно продление/получение оставшийся несданной литературы определенного
пользователя.
Слой "модели предметной области" предназначен для
описания бизнес-логики. К главным функциям слоя относятся отображения
информации и интерпретации вводимых команд с преобразованием их в
соответствующие операции в слое бизнес-логики BUS и источника данных. Оперирует
ссылкой на объекты BookVO и ReaderVO. А также выводит информацию из класса DAO.
Типовые
решения слоя доступа к данным
Слой доступа к базе данных (DAO) строит запрос на основе
параметров, полученных от слоя бизнес-логики, и передает их классу dbConnection
для выполнения. И происходит возврат результатов из класса dbConnection в слой
бизнес-логики.
Также существует класс объект-значение с содержимым методов
GET и SET. Он используется для передачи данных от одного класса другому. Он
непосредственно связан со слоем бизнес-логики и со слоем представления.
Объекты-значения устанавливаются в слое бизнес-логики и читаются из слоя
представления.
Типовые
решения слоя представления
Слой представления - это единственный слой, непосредственно
связанный с пользователем. Слой представления используется для получения данных
от пользователя и передачи их слою бизнес-логики для дальнейшей обработки, и
когда данные получены в объекте-значении, он отвечает за представление
объекта-значения в надлежащей форме, которая понятна пользователю.
Вспомогательные
типовые решения разных слоев
К вспомогательным классам относится класс Hashing -
выполняющий хэширование поступающих данных, а также проверка на валидность
email адресов.
Технологии
программных систем уровня предприятия
Использование технологий уровня предприятия при разработке
программных систем. Выбранная технология использования уровня предриятия - Web
Services.
Библиотеки
программных систем уровня предприятия
Использование библиотек уровня предприятия при разработке
программных систем. При разработке была выбрана технология WinForms
Текст
программы
Разработка классов слоя доступа к данным
public class dbConnection
{SqlDataAdapter myAdapter;SqlConnection conn;
// / <constructor>
// / инициализация подключения
// / </constructor>dbConnection ()
{= new SqlDataAdapter ();= new SqlConnection ("Server =
(local); Database=MyBooks; Trusted_Connection = True");
}
// / <method>
// / открытие подключения к базе данных, если оно было
закрыто или разорвано
// / </method>SqlConnection openConnection ()
{(conn. State == ConnectionState. Closed || conn. State ==
ConnectionState. Broken)
{ conn. Open (); }conn;
}
// / <method>
// / запрос на выборку
// / </method> // DataTable DataSetDataTable
executeSelectQuery (String _query, SqlParameter [] sqlParameter)
{myCommand = new SqlCommand ();dataTable = new DataTable ();=
null;ds = new DataSet ();
{. Connection = openConnection ();.commandText = _query;.
Parameters. AddRange (sqlParameter);. ExecuteNonQuery ();. SelectCommand =
myCommand;. Fill (ds);= ds. Tables [0];
}(SqlException e)
}dataTable;
}
// / <method>
// / запрос на вставку
// / </method>bool executeInsertQuery (String _query,
SqlParameter [] sqlParameter)
{myCommand = new SqlCommand ();
{. Connection = openConnection ();.commandText = _query;.
Parameters. AddRange (sqlParameter);. InsertCommand = myCommand;.
ExecuteNonQuery ();
}(SqlException e)
{ return false; }true;
}
// / <method>
// / запрос на обновление
// / </method>bool executeUpdateQuery (String _query,
SqlParameter [] sqlParameter)
{myCommand = new SqlCommand ();
{. Connection = openConnection ();.commandText = _query;.
Parameters. AddRange (sqlParameter);. UpdateCommand = myCommand;.
ExecuteNonQuery ();
}(SqlException e)
{ return false; }true;
}bool executeDeleteQuery (String _query, SqlParameter []
sqlParameter)
{myCommand = new SqlCommand ();
{. Connection = openConnection ();.commandText = _query;.
Parameters. AddRange (sqlParameter);. DeleteCommand = myCommand;.
ExecuteNonQuery ();
}(SqlException e)
{ return false; }true;
}
}
}
Типовые решения слоя доступа к данным
// Классы слоя доступа к даннымclass ReaderDAO:
IFindReaderData, IReaderAction
{dbConnection conn;
// / <constructor>
// / конструктор UserDAO
// / </constructor>ReaderDAO ()
{ conn = new dbConnection (); }DataTable FindById (int id)
{query = string. Format ("SELECT * FROM Reader WHERE id
LIKE @id");[] sqlParameters = new SqlParameter [1];[0] = new SqlParameter
("@id", SqlDbType. Int);[0]. Value = id;conn. executeSelectQuery
(query, sqlParameters);
}DataTable FindByName (string name)
{query = string. Format ("SELECT * FROM Reader WHERE
name LIKE @name");[] sqlParameters = new SqlParameter [1];[0] = new
SqlParameter ("@name", SqlDbType. NVarChar);[0]. Value = name;conn.
executeSelectQuery (query, sqlParameters);
}DataTable FindByMail (string mail)
{query = string. Format ("SELECT * FROM Reader WHERE
mail LIKE @mail");[] sqlParameters = new SqlParameter [1];[0] = new
SqlParameter ("@mail", SqlDbType. NChar);[0]. Value = mail;conn.
executeSelectQuery (query, sqlParameters);
}bool CreateReader (string name, string mail, DateTime age)
{query = string. Format ("INSERT INTO [Reader] ([name],
[mail], [age])" +
" VALUES (@name, @mail, @age)");[] sqlParameters =
new SqlParameter [3];[0] = new SqlParameter ("@name", SqlDbType.
NVarChar);[0]. Value = name;[1] = new SqlParameter ("@mail",
SqlDbType. NChar);[1]. Value = Hashing. GetHash (mail); // Хэшируем мыло!!!![2]
= new SqlParameter ("@age", SqlDbType. Date);[2]. Value = age;conn.
executeInsertQuery (query, sqlParameters);
}bool DeleteReader (int readerId)
{query = string. Format ("DELETE FROM [Reader] WHERE id
= @readerId)");[] sqlParameters = new SqlParameter [1];[0] = new
SqlParameter ("@readerId", SqlDbType. Int);[0]. Value =
readerId;conn. executeDeleteQuery (query, sqlParameters);
}
}class BookDAO: IFindBookData, IBookAction
{dbConnection conn;BookDAO ()
{ conn = new dbConnection (); }DataTable FindById (int id)
{query = string. Format ("SELECT * FROM Book WHERE id
LIKE @id");[] sqlParameters = new SqlParameter [1];[0] = new SqlParameter
("@id", SqlDbType. Int);[0]. Value = id;conn. executeSelectQuery
(query, sqlParameters);
}DataTable FindByName (string name)
{query = string. Format ("SELECT * FROM Book WHERE name
LIKE @name");[] sqlParameters = new SqlParameter [1];[0] = new
SqlParameter ("@name", SqlDbType. NVarChar);[0]. Value = name;conn.
executeSelectQuery (query, sqlParameters);
}bool CreateBook (string name, string author, string
publisher, DateTime year)
{query = string. Format ("INSERT INTO [Book] ([name],
[author], [publisher], [year])" +
" VALUES (@name, @author, @publisher, @year)");[]
sqlParameters = new SqlParameter [4];[0] = new SqlParameter ("@name",
SqlDbType. NVarChar);[0]. Value = name;[1] = new SqlParameter
("@author", SqlDbType. NChar);[1]. Value = author;[2] = new
SqlParameter ("@publisher", SqlDbType. NChar);[2]. Value =
publisher;[3] = new SqlParameter ("@year", SqlDbType. Date);[3].
Value = year;conn. executeInsertQuery (query, sqlParameters);
}bool DeleteBook (int bookId)
{query = string. Format ("DELETE FROM [Book] WHERE id =
@bookId)");[] sqlParameters = new SqlParameter [1];[0] = new SqlParameter
("@id", SqlDbType. Int);[0]. Value = bookId;conn. executeDeleteQuery
(query, sqlParameters);
}
}class OrderDAO: IOrderAction
{dbConnection conn;OrderDAO ()
{ conn = new dbConnection (); }bool Order (int bookId, int
readerId)
{query = string. Format ("INSERT INTO [Order] ([bookId],
[readerId], [time])" +
" VALUES (@bookId, @readerId, @time)");[]
sqlParameters = new SqlParameter [3];[0] = new SqlParameter
("@bookId", SqlDbType. Int);[0]. Value = bookId;[1] = new
SqlParameter ("@readerId", SqlDbType. Int);[1]. Value = readerId;[2]
= new SqlParameter ("@time", SqlDbType. Date);[2]. Value = DateTime.
Today. AddDays (15);conn. executeInsertQuery (query, sqlParameters);
}bool DeleteOrderBook (int bookId, int readerId)
{query = string. Format ("DELETE FROM [MyBooks]. [dbo].
[Order] " +
"WHERE bookId = @bookId AND readerId =
@readerId");[] sqlParameters = new SqlParameter [2];[0] = new SqlParameter
("@bookId", SqlDbType. Int);[0]. Value = bookId;[1] = new
SqlParameter ("@readerId", SqlDbType. Int);[1]. Value =
readerId;conn. executeDeleteQuery (query, sqlParameters);
}DateTime GetTime (int bookId, int readerId)
{query = string. Format ("SELECT time From [Reader] R
" +
"Inner Join [Order] O On O. readerId = R. id " +
"WHERE O. bookId = @bookId AND O. readerId =
@readerId");[] sqlParameters = new SqlParameter [2];[0] = new SqlParameter
("@bookId", SqlDbType. Int);[0]. Value = bookId;[1] = new
SqlParameter ("@readerId", SqlDbType. Int);[1]. Value = readerId;dt =
conn. executeSelectQuery (query, sqlParameters);dateTime = (DateTime) dt. Rows
[0] ["time"];currentDt = DateTime. Now;span = currentDt -
dateTime;relative = new DateTime (span. Ticks);relative;
}
}
}class ReaderVO
{{ return _idReader; }{ _idReader = value; }
}string Name
{{ return _name; }{ _name = value; }
}string Mail
{{ return _mail; }{ _mail = value; }
}DateTime Age
{{ return _age; }{ _age = value; }
}
}class BookVO
{BookVO () { }int _idBook;string _name;string _author;string
_publisher;DateTime _year;int IdBook
{{ return _idBook; }{ _idBook = value; }
}string Name
{{ return _name; }{ _name = value; }
}string Author
{{ return _author; }{ _author = value; }
}string Publisher
{{ return _publisher; }{ _publisher = value; }
}DateTime Year
{{ return _year; }{ _year = value; }
}
}
Типовые решения слоя представления
// Классы слоя модели предметной областиclass BUS
{ReaderDAO _readerDao;BookDAO _bookDao;OrderDAO _orderDao;BUS
()
{
_readerDao = new ReaderDAO ();
_bookDao = new BookDAO ();
_orderDao = new OrderDAO ();
}BookVO GetBookById (int id)
{bookVo = new BookVO ();dataTable = _bookDao. FindById
(id);(DataRow dr in dataTable. Rows)
{. IdBook = Int32. Parse (dr ["id"]. ToString ());.
Name = dr ["name"]. ToString ();. Author = dr ["author"].
ToString ();. Publisher = dr ["publisher"]. ToString ();. Year =
Convert. ToDateTime (dr ["year"]);
}bookVo;
}BookVO GetBookByName (string name)
{bookVo = new BookVO ();dataTable = _bookDao. FindByName
(name);(DataRow dr in dataTable. Rows)
{. IdBook = Int32. Parse (dr ["id"]. ToString ());.
Name = dr ["name"]. ToString ();. Author = dr ["author"].
ToString ();. Publisher = dr ["publisher"]. ToString ();. Year =
Convert. ToDateTime (dr ["year"]);
}bookVo;
}ReaderVO GetReaderById (int id)
{readerVo = new ReaderVO ();dataTable = _readerDao. FindById
(id);(DataRow dr in dataTable. Rows)
{. IdReader = Int32. Parse (dr ["id"]. ToString
());. Name = dr ["name"]. ToString ();. Mail = dr ["mail"].
ToString ();. Age = Convert. ToDateTime (dr ["age"]);
}readerVo;
}ReaderVO GetReaderByName (string name)
{readerVo = new ReaderVO ();dataTable = _readerDao.
FindByName (name);(DataRow dr in dataTable. Rows)
{. IdReader = Int32. Parse (dr ["id"]. ToString
());. Name = dr ["name"]. ToString ();. Mail = dr ["mail"].
ToString ();. Age = Convert. ToDateTime (dr ["age"]);
}readerVo;
}ReaderVO GetReaderByMail (string mail)
{readerVo = new ReaderVO ();dataTable = _readerDao.
FindByMail (mail);(DataRow dr in dataTable. Rows)
{. IdReader = Int32. Parse (dr ["id"]. ToString
());. Name = dr ["name"]. ToString ();. Mail = dr ["mail"].
ToString ();. Age = Convert. ToDateTime (dr ["age"]);
}readerVo;
}bool CreateBook (string name, string author, string publisher,
DateTime year)
{ return _bookDao. CreateBook (name, author, publisher,
year); }bool CreateReader (string name, string mail, DateTime age)
{ return _readerDao. CreateReader (name, mail, age); }bool
DeleteBook (int id)
{ return _bookDao. DeleteBook (id); }bool DeleteReader (int
id)
{ return _readerDao. DeleteReader (id); }bool OrderBook (int
bookId, int readerId)
{ return _orderDao. Order (bookId, readerId); }bool
DeleteOrderBook (int bookId, int readerId)
{ return _orderDao. DeleteOrderBook (bookId, readerId);
}DateTime GetOrderBookTime (int bookId, int readerId)
{ return _orderDao. GetTime (bookId, readerId); }
}static class Hashing
{
// / <summary>
// / Шифруем Email по MD5
// / </summary>
// / <param name="input"></param>
// / <returns></returns>static string
GetHashString (string input)
{[] byteValue = Encoding. UTF8. GetBytes (input);crypto = new
MD5CryptoServiceProvider ();[] byteHash = crypto.computeHash (byteValue);result
= null;(byte b in byteHash)
{ result += string. Format ("{0: x2}", b); }result;
}
// / <summary>
// / Проверка на валидность email адресов
// / </summary>static bool isValid (string email)
{pattern = " [. \\-_a-z0-9] +@ ([a-z0-9] [\\-a-z0-9]
+\\.) + [a-z] {2,6}";isMatch = Regex. Match (email, pattern, RegexOptions.
IgnoreCase);isMatch. Success;
// / <summary>
// / Получить хеш строку
// / </summary>static string GetHash (string str)
{(! isValid (str) || String. IsNullOrEmpty
(str))null;GetHashString (str). Trim ();
}
Технологии программных систем уровня предприятияSystem. Web.
Services;WebApplication1
{
// / <summary>
// / Summary description for WebService1
// / </summary>
[WebService (Namespace = "http://tempuri.org/",
Name = "Веб сервис Библиотека", Description = "4834кф Басковский
Денис")]
[WebServiceBinding (ConformsTo = WsiProfiles.
BasicProfile1_1)]
[ToolboxItem (false)]
// To allow this Web Service to be called from script, using
ASP.net AJAX, uncomment the following line.
// [System. Web. Script. Services. ScriptService]class
WebService1: WebService
{BUS _BUS = new BUS ();
[WebMethod (Description = "Получить информацию о
имеющихся книге по ID")]string GetBooksFromId (int id)
{bookVo = _BUS. GetBookById (id);String. Format ("{0}
{1} {2} {3} {4}", bookVo. IdBook, bookVo. Name, bookVo. Author, bookVo.
Publisher, bookVo. Year);
}
[WebMethod (Description = "Получить информацию о
имеющихся книге по Name")]string GetBooksFromName (string name)
{bookVo = _BUS. GetBookByName (name);String. Format
("{0} {1} {2} {3} {4}", bookVo. IdBook, bookVo. Name, bookVo. Author,
bookVo. Publisher, bookVo. Year);
}
[WebMethod (Description = "Получить информацию о
читателе по Id")]string GetReaderFromId (int id)
{readerVo = _BUS. GetReaderById (id);String. Format
("{0} {1} {2}", readerVo. IdReader, readerVo. Name, readerVo. Age);
}
[WebMethod (Description = "Получить информацию о
читателе по Name")]string GetReaderFromName (string name)
{readerVo = _BUS. GetReaderByName (name);String. Format
("{0} {1} {2} {3}", readerVo. IdReader, readerVo. Name, readerVo.
Mail, readerVo. Age);
}
[WebMethod (Description = "Получить информацию о
читателе по Mail")]string GetReaderFromMail (string mail)
{readerVo = _BUS. GetReaderByMail (mail);String. Format
("{0} {1} {2} {3}", readerVo. IdReader, readerVo. Name, readerVo.
Mail, readerVo. Age);
}
[WebMethod (Description = "Добавить свою
книгу")]bool CreateBook (string name, string author, string publisher,
DateTime year)
{ return _BUS. CreateBook (name, author, publisher, year); }
[WebMethod (Description = "Добавить Читателя")]bool
CreateReader (string name, string mail, DateTime age)
{ return _BUS. CreateReader (name, mail, age); }
[WebMethod (Description = "Удалить книгу")]bool
DeleteBook (int id)
{ return _BUS. DeleteBook (id); }
[WebMethod (Description = "Удалить ЧИтателя")]bool
DeleteReader (int id)
{ return _BUS. DeleteReader (id); }
[WebMethod (Description = "Оформить книгу")]bool
OrderBook (int bookId, int readerId)
{ return _BUS. OrderBook (bookId, readerId); }
[WebMethod (Description = "Сдать книгу")]bool
DeleteOrderBook (int bookId, int readerId)
{ return _BUS. DeleteOrderBook (bookId, readerId); }
[WebMethod (Description = "Получить количество
оставшихся дней до сдачи")]DateTime GetOrderBookTime (int bookId, int
readerId)
{ return _BUS. GetOrderBookTime (bookId, readerId); }
}
}
Библиотеки
программных систем уровня предприятия
using Laba2Client. ServiceReferenceMy;Laba2Client
{partial class Form1: Form
{ServiceReferenceMy. ВебсервисБасковскогоДенисаSoapClient
mSoapClient;DataSet ds;Form1 ()
{();= new ВебсервисБасковскогоДенисаSoapClient ();
}void buttonBuy_Click (object sender, EventArgs e)
{
// Добавить книгу(mSoapClient. CreateBook (textBox1. Text.
Trim (), textBox2. Text. Trim (), textBox3. Text. Trim (), dateTimePicker1.
Value)). Show ("Книга добавлена!");. Show ("УПС");
}void button7_Click (object sender, EventArgs e)
{
// Добавить читателя(mSoapClient. CreateReader (textBox6.
Text. Trim (), textBox4. Text. Trim (), dateTimePicker2. Value)). Show
("Читатель добавлен!");. Show ("УПС");
}void button2_Click (object sender, EventArgs e)
{
// Оформить книгу(mSoapClient. OrderBook (Convert. ToInt32
(textBox5. Text. Trim ()), Convert. ToInt32 (textBox8. Text. Trim ()))). Show
("Оформление добавлен!");. Show ("УПС");
}void button1_Click (object sender, EventArgs e)
{
// Сдача книги(mSoapClient. DeleteOrderBook (Convert. ToInt32
(textBox5. Text. Trim ()), Convert. ToInt32 (textBox8. Text. Trim ()))). Show
("Сдача добавлен!");. Show ("УПС");
}void button3_Click (object sender, EventArgs e)
{
// Оставшееся время. Show ("Осталось." +
mSoapClient. GetOrderBookTime (Convert. ToInt32 (textBox5. Text. Trim ()),
Convert. ToInt32 (textBox8. Text. Trim ())));
}void button4_Click (object sender, EventArgs e)
{
// Информация о книге. Show (mSoapClient. GetBooksFromName
(textBox13. Text. Trim ()));
}void button5_Click (object sender, EventArgs e)
// Информация о читателе. Show (mSoapClient.
GetReaderFromName (textBox12. Text. Trim ()));
}
}
}
Выводы
В ходе выполнения лабораторных работ был создан веб-сервис
Библиотека, предоставляющий определенные механизмы работы с данными на стороне
клиентского приложения. В качестве типового решения был выбран - тонкий клиент.
Веб-служба Библиотека позволяет выполнять все необходимые операции с
поступившими/сдавшими книгами. Основанная на WEB-сервисе и трехуровневой
архитектуре приложения, позволяет выполнять запросы на выборку, вставку и
другие операции используя любой язык программирования поддерживающий
WEB-сервис.