Разработка архитектуры программной системы "Библиотека"
Обзор существующих объектных архитектур. Архитектура программного обеспечения. Создание веб-сервиса "Библиотека", предоставляющего механизмы работы с данными на стороне клиентского приложения. 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