Разработка архитектуры программной системы 'Библиотека'

  • Вид работы:
    Практическое задание
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    652,58 Кб
  • Опубликовано:
    2013-06-16
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка архитектуры программной системы 'Библиотека'













ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ

Разработка архитектуры программной системы "Библиотека"

По дисциплине: Стандарты и технологии распределенных объектных архитектур


Работу выполнил студент гр.

Басковский Д.С.





Санкт-Петербург

Содержание

Обзор существующих архитектур

Архитектура ПО

Текст программы

Выводы

Обзор существующих архитектур


.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-сервис.

Похожие работы на - Разработка архитектуры программной системы 'Библиотека'

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!