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

Обзор существующих объектных архитектур. Архитектура программного обеспечения. Создание веб-сервиса "Библиотека", предоставляющего механизмы работы с данными на стороне клиентского приложения. WEB-сервис и трехуровневая архитектура в основе приложения.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 16.06.2013
Размер файла 1,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

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

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

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

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

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

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

2012

Содержание

  • Обзор существующих архитектур
  • Архитектура ПО
  • Текст программы
  • Выводы

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

.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

{

private SqlDataAdapter myAdapter;

private SqlConnection conn;

// / <constructor>

// / инициализация подключения

// / </constructor>

public dbConnection ()

{

myAdapter = new SqlDataAdapter ();

conn = new SqlConnection ("Server = (local); Database=MyBooks; Trusted_Connection = True");

}

// / <method>

// / открытие подключения к базе данных, если оно было закрыто или разорвано

// / </method>

private SqlConnection openConnection ()

{

if (conn. State == ConnectionState. Closed || conn. State == ConnectionState. Broken)

{ conn. Open (); }

return conn;

}

// / <method>

// / запрос на выборку

// / </method> // DataTable DataSet

public DataTable executeSelectQuery (String _query, SqlParameter [] sqlParameter)

{

SqlCommand myCommand = new SqlCommand ();

DataTable dataTable = new DataTable ();

dataTable = null;

DataSet ds = new DataSet ();

try

{

myCommand. Connection = openConnection ();

myCommand.commandText = _query;

myCommand. Parameters. AddRange (sqlParameter);

myCommand. ExecuteNonQuery ();

myAdapter. SelectCommand = myCommand;

myAdapter. Fill (ds);

dataTable = ds. Tables [0];

}

catch (SqlException e)

{

return null;

}

return dataTable;

}

// / <method>

// / запрос на вставку

// / </method>

public bool executeInsertQuery (String _query, SqlParameter [] sqlParameter)

{

SqlCommand myCommand = new SqlCommand ();

try

{

myCommand. Connection = openConnection ();

myCommand.commandText = _query;

myCommand. Parameters. AddRange (sqlParameter);

myAdapter. InsertCommand = myCommand;

myCommand. ExecuteNonQuery ();

}

catch (SqlException e)

{ return false; }

return true;

}

// / <method>

// / запрос на обновление

// / </method>

public bool executeUpdateQuery (String _query, SqlParameter [] sqlParameter)

{

SqlCommand myCommand = new SqlCommand ();

try

{

myCommand. Connection = openConnection ();

myCommand.commandText = _query;

myCommand. Parameters. AddRange (sqlParameter);

myAdapter. UpdateCommand = myCommand;

myCommand. ExecuteNonQuery ();

}

catch (SqlException e)

{ return false; }

return true;

}

public bool executeDeleteQuery (String _query, SqlParameter [] sqlParameter)

{

SqlCommand myCommand = new SqlCommand ();

try

{

myCommand. Connection = openConnection ();

myCommand.commandText = _query;

myCommand. Parameters. AddRange (sqlParameter);

myAdapter. DeleteCommand = myCommand;

myCommand. ExecuteNonQuery ();

}

catch (SqlException e)

{ return false; }

return true;

}

}

}

Типовые решения слоя доступа к данным

// Классы слоя доступа к данным

public class ReaderDAO: IFindReaderData, IReaderAction

{

private dbConnection conn;

// / <constructor>

// / конструктор UserDAO

// / </constructor>

public ReaderDAO ()

{ conn = new dbConnection (); }

public DataTable FindById (int id)

{

string query = string. Format ("SELECT * FROM Reader WHERE id LIKE @id");

SqlParameter [] sqlParameters = new SqlParameter [1];

sqlParameters [0] = new SqlParameter ("@id", SqlDbType. Int);

sqlParameters [0]. Value = id;

return conn. executeSelectQuery (query, sqlParameters);

}

public DataTable FindByName (string name)

{

string query = string. Format ("SELECT * FROM Reader WHERE name LIKE @name");

SqlParameter [] sqlParameters = new SqlParameter [1];

sqlParameters [0] = new SqlParameter ("@name", SqlDbType. NVarChar);

sqlParameters [0]. Value = name;

return conn. executeSelectQuery (query, sqlParameters);

}

public DataTable FindByMail (string mail)

{

string query = string. Format ("SELECT * FROM Reader WHERE mail LIKE @mail");

SqlParameter [] sqlParameters = new SqlParameter [1];

sqlParameters [0] = new SqlParameter ("@mail", SqlDbType. NChar);

sqlParameters [0]. Value = mail;

return conn. executeSelectQuery (query, sqlParameters);

}

public bool CreateReader (string name, string mail, DateTime age)

{

string query = string. Format ("INSERT INTO [Reader] ([name], [mail], [age])" +

" VALUES (@name, @mail, @age)");

SqlParameter [] sqlParameters = new SqlParameter [3];

sqlParameters [0] = new SqlParameter ("@name", SqlDbType. NVarChar);

sqlParameters [0]. Value = name;

sqlParameters [1] = new SqlParameter ("@mail", SqlDbType. NChar);

sqlParameters [1]. Value = Hashing. GetHash (mail); // Хэшируем мыло!!!!

sqlParameters [2] = new SqlParameter ("@age", SqlDbType. Date);

sqlParameters [2]. Value = age;

return conn. executeInsertQuery (query, sqlParameters);

}

public bool DeleteReader (int readerId)

{

string query = string. Format ("DELETE FROM [Reader] WHERE id = @readerId)");

SqlParameter [] sqlParameters = new SqlParameter [1];

sqlParameters [0] = new SqlParameter ("@readerId", SqlDbType. Int);

sqlParameters [0]. Value = readerId;

return conn. executeDeleteQuery (query, sqlParameters);

}

}

public class BookDAO: IFindBookData, IBookAction

{

private dbConnection conn;

public BookDAO ()

{ conn = new dbConnection (); }

public DataTable FindById (int id)

{

string query = string. Format ("SELECT * FROM Book WHERE id LIKE @id");

SqlParameter [] sqlParameters = new SqlParameter [1];

sqlParameters [0] = new SqlParameter ("@id", SqlDbType. Int);

sqlParameters [0]. Value = id;

return conn. executeSelectQuery (query, sqlParameters);

}

public DataTable FindByName (string name)

{

string query = string. Format ("SELECT * FROM Book WHERE name LIKE @name");

SqlParameter [] sqlParameters = new SqlParameter [1];

sqlParameters [0] = new SqlParameter ("@name", SqlDbType. NVarChar);

sqlParameters [0]. Value = name;

return conn. executeSelectQuery (query, sqlParameters);

}

public bool CreateBook (string name, string author, string publisher, DateTime year)

{

string query = string. Format ("INSERT INTO [Book] ([name], [author], [publisher], [year])" +

" VALUES (@name, @author, @publisher, @year)");

SqlParameter [] sqlParameters = new SqlParameter [4];

sqlParameters [0] = new SqlParameter ("@name", SqlDbType. NVarChar);

sqlParameters [0]. Value = name;

sqlParameters [1] = new SqlParameter ("@author", SqlDbType. NChar);

sqlParameters [1]. Value = author;

sqlParameters [2] = new SqlParameter ("@publisher", SqlDbType. NChar);

sqlParameters [2]. Value = publisher;

sqlParameters [3] = new SqlParameter ("@year", SqlDbType. Date);

sqlParameters [3]. Value = year;

return conn. executeInsertQuery (query, sqlParameters);

}

public bool DeleteBook (int bookId)

{

string query = string. Format ("DELETE FROM [Book] WHERE id = @bookId)");

SqlParameter [] sqlParameters = new SqlParameter [1];

sqlParameters [0] = new SqlParameter ("@id", SqlDbType. Int);

sqlParameters [0]. Value = bookId;

return conn. executeDeleteQuery (query, sqlParameters);

}

}

public class OrderDAO: IOrderAction

{

private dbConnection conn;

public OrderDAO ()

{ conn = new dbConnection (); }

public bool Order (int bookId, int readerId)

{

string query = string. Format ("INSERT INTO [Order] ([bookId], [readerId], [time])" +

" VALUES (@bookId, @readerId, @time)");

SqlParameter [] sqlParameters = new SqlParameter [3];

sqlParameters [0] = new SqlParameter ("@bookId", SqlDbType. Int);

sqlParameters [0]. Value = bookId;

sqlParameters [1] = new SqlParameter ("@readerId", SqlDbType. Int);

sqlParameters [1]. Value = readerId;

sqlParameters [2] = new SqlParameter ("@time", SqlDbType. Date);

sqlParameters [2]. Value = DateTime. Today. AddDays (15);

return conn. executeInsertQuery (query, sqlParameters);

}

public bool DeleteOrderBook (int bookId, int readerId)

{

string query = string. Format ("DELETE FROM [MyBooks]. [dbo]. [Order] " +

"WHERE bookId = @bookId AND readerId = @readerId");

SqlParameter [] sqlParameters = new SqlParameter [2];

sqlParameters [0] = new SqlParameter ("@bookId", SqlDbType. Int);

sqlParameters [0]. Value = bookId;

sqlParameters [1] = new SqlParameter ("@readerId", SqlDbType. Int);

sqlParameters [1]. Value = readerId;

return conn. executeDeleteQuery (query, sqlParameters);

}

public DateTime GetTime (int bookId, int readerId)

{

string 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");

SqlParameter [] sqlParameters = new SqlParameter [2];

sqlParameters [0] = new SqlParameter ("@bookId", SqlDbType. Int);

sqlParameters [0]. Value = bookId;

sqlParameters [1] = new SqlParameter ("@readerId", SqlDbType. Int);

sqlParameters [1]. Value = readerId;

DataTable dt = conn. executeSelectQuery (query, sqlParameters);

DateTime dateTime = (DateTime) dt. Rows [0] ["time"];

DateTime currentDt = DateTime. Now;

TimeSpan span = currentDt - dateTime;

DateTime relative = new DateTime (span. Ticks);

return relative;

}

}

}

public class ReaderVO

{

public ReaderVO () { }

private int _idReader;

private string _name;

private string _mail;

private DateTime _age;

public int IdReader

{

get { return _idReader; }

set { _idReader = value; }

}

public string Name

{

get { return _name; }

set { _name = value; }

}

public string Mail

{

get { return _mail; }

set { _mail = value; }

}

public DateTime Age

{

get { return _age; }

set { _age = value; }

}

}

public class BookVO

{

public BookVO () { }

private int _idBook;

private string _name;

private string _author;

private string _publisher;

private DateTime _year;

public int IdBook

{

get { return _idBook; }

set { _idBook = value; }

}

public string Name

{

get { return _name; }

set { _name = value; }

}

public string Author

{

get { return _author; }

set { _author = value; }

}

public string Publisher

{

get { return _publisher; }

set { _publisher = value; }

}

public DateTime Year

{

get { return _year; }

set { _year = value; }

}

}

Типовые решения слоя представления

// Классы слоя модели предметной области

public class BUS

{

private ReaderDAO _readerDao;

private BookDAO _bookDao;

private OrderDAO _orderDao;

public BUS ()

{

_readerDao = new ReaderDAO ();

_bookDao = new BookDAO ();

_orderDao = new OrderDAO ();

}

public BookVO GetBookById (int id)

{

BookVO bookVo = new BookVO ();

DataTable dataTable = _bookDao. FindById (id);

foreach (DataRow dr in dataTable. Rows)

{

bookVo. IdBook = Int32. Parse (dr ["id"]. ToString ());

bookVo. Name = dr ["name"]. ToString ();

bookVo. Author = dr ["author"]. ToString ();

bookVo. Publisher = dr ["publisher"]. ToString ();

bookVo. Year = Convert. ToDateTime (dr ["year"]);

}

return bookVo;

}

public BookVO GetBookByName (string name)

{

BookVO bookVo = new BookVO ();

DataTable dataTable = _bookDao. FindByName (name);

foreach (DataRow dr in dataTable. Rows)

{

bookVo. IdBook = Int32. Parse (dr ["id"]. ToString ());

bookVo. Name = dr ["name"]. ToString ();

bookVo. Author = dr ["author"]. ToString ();

bookVo. Publisher = dr ["publisher"]. ToString ();

bookVo. Year = Convert. ToDateTime (dr ["year"]);

}

return bookVo;

}

public ReaderVO GetReaderById (int id)

{

ReaderVO readerVo = new ReaderVO ();

DataTable dataTable = _readerDao. FindById (id);

foreach (DataRow dr in dataTable. Rows)

{

readerVo. IdReader = Int32. Parse (dr ["id"]. ToString ());

readerVo. Name = dr ["name"]. ToString ();

readerVo. Mail = dr ["mail"]. ToString ();

readerVo. Age = Convert. ToDateTime (dr ["age"]);

}

return readerVo;

}

public ReaderVO GetReaderByName (string name)

{

ReaderVO readerVo = new ReaderVO ();

DataTable dataTable = _readerDao. FindByName (name);

foreach (DataRow dr in dataTable. Rows)

{

readerVo. IdReader = Int32. Parse (dr ["id"]. ToString ());

readerVo. Name = dr ["name"]. ToString ();

readerVo. Mail = dr ["mail"]. ToString ();

readerVo. Age = Convert. ToDateTime (dr ["age"]);

}

return readerVo;

}

public ReaderVO GetReaderByMail (string mail)

{

ReaderVO readerVo = new ReaderVO ();

DataTable dataTable = _readerDao. FindByMail (mail);

foreach (DataRow dr in dataTable. Rows)

{

readerVo. IdReader = Int32. Parse (dr ["id"]. ToString ());

readerVo. Name = dr ["name"]. ToString ();

readerVo. Mail = dr ["mail"]. ToString ();

readerVo. Age = Convert. ToDateTime (dr ["age"]);

}

return readerVo;

}

public bool CreateBook (string name, string author, string publisher, DateTime year)

{ return _bookDao. CreateBook (name, author, publisher, year); }

public bool CreateReader (string name, string mail, DateTime age)

{ return _readerDao. CreateReader (name, mail, age); }

public bool DeleteBook (int id)

{ return _bookDao. DeleteBook (id); }

public bool DeleteReader (int id)

{ return _readerDao. DeleteReader (id); }

public bool OrderBook (int bookId, int readerId)

{ return _orderDao. Order (bookId, readerId); }

public bool DeleteOrderBook (int bookId, int readerId)

{ return _orderDao. DeleteOrderBook (bookId, readerId); }

public DateTime GetOrderBookTime (int bookId, int readerId)

{ return _orderDao. GetTime (bookId, readerId); }

}

public static class Hashing

{

// / <summary>

// / Шифруем Email по MD5

// / </summary>

// / <param name="input"></param>

// / <returns></returns>

private static string GetHashString (string input)

{

byte [] byteValue = Encoding. UTF8. GetBytes (input);

var crypto = new MD5CryptoServiceProvider ();

byte [] byteHash = crypto.computeHash (byteValue);

string result = null;

foreach (byte b in byteHash)

{ result += string. Format ("{0: x2}", b); }

return result;

}

// / <summary>

// / Проверка на валидность email адресов

// / </summary>

private static bool isValid (string email)

{

string pattern = " [. \\-_a-z0-9] +@ ([a-z0-9] [\\-a-z0-9] +\\.) + [a-z] {2,6}";

Match isMatch = Regex. Match (email, pattern, RegexOptions. IgnoreCase);

return isMatch. Success;

}

// / <summary>

// / Получить хеш строку

// / </summary>

public static string GetHash (string str)

{

if (! isValid (str) || String. IsNullOrEmpty (str))

return null;

return GetHashString (str). Trim ();

}

Технологии программных систем уровня предприятия

using System. Web. Services;

namespace 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]

public class WebService1: WebService

{

private BUS _BUS = new BUS ();

[WebMethod (Description = "Получить информацию о имеющихся книге по ID")]

public string GetBooksFromId (int id)

{

BookVO bookVo = _BUS. GetBookById (id);

return String. Format ("{0} {1} {2} {3} {4}", bookVo. IdBook, bookVo. Name, bookVo. Author, bookVo. Publisher, bookVo. Year);

}

[WebMethod (Description = "Получить информацию о имеющихся книге по Name")]

public string GetBooksFromName (string name)

{

BookVO bookVo = _BUS. GetBookByName (name);

return String. Format ("{0} {1} {2} {3} {4}", bookVo. IdBook, bookVo. Name, bookVo. Author, bookVo. Publisher, bookVo. Year);

}

[WebMethod (Description = "Получить информацию о читателе по Id")]

public string GetReaderFromId (int id)

{

ReaderVO readerVo = _BUS. GetReaderById (id);

return String. Format ("{0} {1} {2}", readerVo. IdReader, readerVo. Name, readerVo. Age);

}

[WebMethod (Description = "Получить информацию о читателе по Name")]

public string GetReaderFromName (string name)

{

ReaderVO readerVo = _BUS. GetReaderByName (name);

return String. Format ("{0} {1} {2} {3}", readerVo. IdReader, readerVo. Name, readerVo. Mail, readerVo. Age);

}

[WebMethod (Description = "Получить информацию о читателе по Mail")]

public string GetReaderFromMail (string mail)

{

ReaderVO readerVo = _BUS. GetReaderByMail (mail);

return String. Format ("{0} {1} {2} {3}", readerVo. IdReader, readerVo. Name, readerVo. Mail, readerVo. Age);

}

[WebMethod (Description = "Добавить свою книгу")]

public bool CreateBook (string name, string author, string publisher, DateTime year)

{ return _BUS. CreateBook (name, author, publisher, year); }

[WebMethod (Description = "Добавить Читателя")]

public bool CreateReader (string name, string mail, DateTime age)

{ return _BUS. CreateReader (name, mail, age); }

[WebMethod (Description = "Удалить книгу")]

public bool DeleteBook (int id)

{ return _BUS. DeleteBook (id); }

[WebMethod (Description = "Удалить ЧИтателя")]

public bool DeleteReader (int id)

{ return _BUS. DeleteReader (id); }

[WebMethod (Description = "Оформить книгу")]

public bool OrderBook (int bookId, int readerId)

{ return _BUS. OrderBook (bookId, readerId); }

[WebMethod (Description = "Сдать книгу")]

public bool DeleteOrderBook (int bookId, int readerId)

{ return _BUS. DeleteOrderBook (bookId, readerId); }

[WebMethod (Description = "Получить количество оставшихся дней до сдачи")]

public DateTime GetOrderBookTime (int bookId, int readerId)

{ return _BUS. GetOrderBookTime (bookId, readerId); }

}

}

Библиотеки программных систем уровня предприятия

using Laba2Client. ServiceReferenceMy;

namespace Laba2Client

{

public partial class Form1: Form

{

private ServiceReferenceMy. ВебсервисБасковскогоДенисаSoapClient mSoapClient;

private DataSet ds;

public Form1 ()

{

InitializeComponent ();

mSoapClient = new ВебсервисБасковскогоДенисаSoapClient ();

}

private void buttonBuy_Click (object sender, EventArgs e)

{

// Добавить книгу

if (mSoapClient. CreateBook (textBox1. Text. Trim (), textBox2. Text. Trim (), textBox3. Text. Trim (), dateTimePicker1. Value))

MessageBox. Show ("Книга добавлена!");

else

MessageBox. Show ("УПС");

}

private void button7_Click (object sender, EventArgs e)

{

// Добавить читателя

if (mSoapClient. CreateReader (textBox6. Text. Trim (), textBox4. Text. Trim (), dateTimePicker2. Value))

MessageBox. Show ("Читатель добавлен!");

else

MessageBox. Show ("УПС");

}

private void button2_Click (object sender, EventArgs e)

{

// Оформить книгу

if (mSoapClient. OrderBook (Convert. ToInt32 (textBox5. Text. Trim ()), Convert. ToInt32 (textBox8. Text. Trim ())))

MessageBox. Show ("Оформление добавлен!");

else

MessageBox. Show ("УПС");

}

private void button1_Click (object sender, EventArgs e)

{

// Сдача книги

if (mSoapClient. DeleteOrderBook (Convert. ToInt32 (textBox5. Text. Trim ()), Convert. ToInt32 (textBox8. Text. Trim ())))

MessageBox. Show ("Сдача добавлен!");

else

MessageBox. Show ("УПС");

}

private void button3_Click (object sender, EventArgs e)

{

// Оставшееся время

MessageBox. Show ("Осталось." + mSoapClient. GetOrderBookTime (Convert. ToInt32 (textBox5. Text. Trim ()), Convert. ToInt32 (textBox8. Text. Trim ())));

}

private void button4_Click (object sender, EventArgs e)

{

// Информация о книге

MessageBox. Show (mSoapClient. GetBooksFromName (textBox13. Text. Trim ()));

}

private void button5_Click (object sender, EventArgs e)

{

// Информация о читателе

MessageBox. Show (mSoapClient. GetReaderFromName (textBox12. Text. Trim ()));

}

}

}

Выводы

В ходе выполнения лабораторных работ был создан веб-сервис Библиотека, предоставляющий определенные механизмы работы с данными на стороне клиентского приложения. В качестве типового решения был выбран - тонкий клиент. Веб-служба Библиотека позволяет выполнять все необходимые операции с поступившими/сдавшими книгами. Основанная на WEB-сервисе и трехуровневой архитектуре приложения, позволяет выполнять запросы на выборку, вставку и другие операции используя любой язык программирования поддерживающий WEB-сервис.

Размещено на Allbest.ru


Подобные документы

  • Проблема управления инфраструктурой веб-приложения с микросервисной архитектурой. Тенденции к созданию программного обеспечения. Ключевые направления в разработке веб-приложений. Архитектура спроектированной системы мониторинга. Эффективность сервиса.

    статья [532,1 K], добавлен 10.12.2016

  • Разработка базы данных для информационной системы "Библиотека". Системный анализ, инфологическое, даталогическое и физическое проектирование. Программирование бизнес-логики, разработка клиентского приложения. Создание web-приложения, web-доступ.

    курсовая работа [3,3 M], добавлен 15.09.2014

  • Разработка реляционной базы данных "Библиотека" с помощью СУБД Microsoft SQL Server 2000 и программной оболочки в Microsoft Access. Экономическое обоснование результатов внедрения программного продукта. Инструкция по эксплуатации клиентского приложения.

    курсовая работа [3,4 M], добавлен 01.07.2011

  • Краткая характеристика объекта управления, обзор и анализ существующих аналогов, реализующих его функции. Разработка архитектуры программной системы, тестирование и оценка эффективности приложения. Развертывание и использование программного продукта.

    курсовая работа [691,0 K], добавлен 05.02.2015

  • Разработка приложений для смартфонов на ОС Android для сети аптек "Фармация". Архитектура операционной системы Android. Архитектура и реализация приложения. Его функциональность. Описание работы мобильного приложения. Расчет затрат на создание продукта.

    дипломная работа [1,6 M], добавлен 17.06.2017

  • Характеристика объекта автоматизации. Создание многоуровневой архитектуры приложения, отладка метода безошибочной идентификации пользователей системы. Разработка нестандартного метода преобразования объектов базы данных в объекты классов приложения.

    курсовая работа [395,4 K], добавлен 28.04.2015

  • Выбор и обоснование аппаратного обеспечения. Типы архитектуры веб-приложений. Шаблоны проектирования архитектуры приложения. Разработка инфологической модели базы данных. Подготовка к разработке приложения. Рассмотрение причин возникновения паттернов.

    дипломная работа [3,0 M], добавлен 27.11.2022

  • Изучение стадий и этапов разработки программного обеспечения и эксплуатационных документов. Обзор создания архитектуры, распространения и поддержки системы приложения. Анализ проблем интерфейсов между программным обеспечением и операционной системой.

    курсовая работа [1,2 M], добавлен 30.04.2012

  • Общее определение JavaScript-библиотеки, виды библиотек. Создание клиентского приложения с использованием одного из существующий JS-фреймворков. Значение, виды и выбор фреймворка. Выбор приложения и его тематики. Написание программного кода, итоги работы.

    курсовая работа [545,8 K], добавлен 21.12.2013

  • Проектирование Web-сервиса учебного процесса кафедры физкультуры. Анализ существующих решений и построение моделей предметной области. Разработка базы данных Web-сервиса для обеспечения функциональности работы. Архитектура, интерфейс, взаимодействие с БД.

    дипломная работа [1,9 M], добавлен 05.04.2017

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.