Post on 20-Jun-2015
description
Архитектура корпоративных систем
Планы на ближайшее время
30 марта — лабораторная работа №2
3 апреля — модульное тестирование
10 апреля — рефакторинг
17 апреля — разработка пользовательских интерфейсов
24 апреля — дизайн пользовательских интерфейсов (!!!)
Виды корпоративных приложений
Архитектура?
Архитектура
— представление системы программного обеспечения, процесс, а также и дисциплина, посвященные эффективной разработке проекта данной системы.
Модель OSI
Историческая справка
Историческая справка
— Все вместе
Историческая справка
— Клиентское приложение
— Сервер баз данных
Историческая справка
— Представление (presentation)
— Домен (предметная область)
— Источник данных
Задача
Организация логики предметной области
Сценарии транзакцииclass Cart{ public DataTable GetItems();
public decimal GetTotalPrice();
public void AddItemToCart(int a_ItemId);
public void RemoveItemFromCart(int a_ItemId);
public void Offer(int a_UserId);
public DataRow GetCurrentUser();
...}
Сценарии транзакцииclass Cart{ public DataTable GetItems() { XCommand command = Registry.DataBase.CreateCommand("select * from CartItems join Items
on Items.id = CartItems.id_Item where id_Session = @session"); command["session"].Value = GetSessionId(); return command.ExecuteDataTable(); }
public decimal GetTotalPrice() { XCommand command = Registry.DataBase.CreateCommand("select sum(Price * Amount) from
CartItems join Items on Items.id = CartItems.id_Item where id_Session = @session"); command["session"].Value = GetSessionId(); return (decimal)command.ExecuteScalar(); }
public void AddItemToCart(int a_ItemId) { XCommand command = Registry.DataBase.CreateCommand("insert into CartItems (id_Session,
id_Item) values (@session, @item)"); command["session"].Value = GetSessionId(); command["item"].Value = a_ItemId; command.ExecuteNonQuery(); }
Модуль таблицы
— DataSet
— DataTable
— DataRow
Модуль таблицыpublic void AddItemToCart(DataRow a_Item){ DataTable cartItems = new DataTable("CartItems"); DataRow newCartItem = items.NewRow(); newCartItem["id_Item"] = a_Item["id"]; newCartItem["id_Session"] = Registry.GetSessionId(); Registry.DataBase.Update(cartItems);}
Модуль таблицыpublic void AddItemToCart(DB.ItemsRow a_Item){ DB.CartItems cartItems = new DB.CartItems(); DB.CartItemsRow newCartItem = items.NewRow(); newCartItem.id_Item = a_Item.id; newCartItem.id_Session = Registry.GetSessionId(); Registry.DataBase.Update(cartItems);}
Модель предметной областиclass Cart{ public List<Item> Items;
public decimal GetTotalPrice();
public void Save();
...}
class Item{ public string Description;
public decimal Price;
…}
Модель предметной области
Cart cart = Cart.GetCurrent();
Item item = new Item(234);
cart.Items.Add(item);
cart.Save();
Модель предметной областиpublic decimal GetTotalPrice(){ decimal result = 0;
foreach(Item item in Items) { result += item.Price; }
return result;}
Модель предметной областиVS сценарий транзакцииpublic decimal GetTotalPrice(){ XCommand command = Registry.DataBase.CreateCommand("select sum(Price *
Amount) from CartItems join Items on Items.id = CartItems.id_Item where id_Session = @session");
command["session"].Value = GetSessionId(); return (decimal)command.ExecuteScalar();}
public decimal GetTotalPrice(){ decimal result = 0; foreach(Item item in Items) { result += item.Price; } return result;}
Сравнение
:-)
Организация логики работы с базой данных
ActiveRow (активная запись)class Company{ DB.CompaniesRow m_Row;
public Company(DB.CompaniesRow a_Row) { m_Row = a_Row; }
public int Id { get { return m_Row.id; } } public string Alias { get { return m_Row.Alias; } set { m_Row.Alias = value; } } public string FullName { get { return m_Row.FullName; } set { m_Row.FullName = value; } }
public void Save() { XRegistry.DataBase.Update(m_Row); }}
ActiveRowpublic static Company Find(int a_Id){ XCommand command = Registry.DataBase.CreateCommand("select
* from Companies where id = @id"); command["id"].Value = a_Id; DB.CompaniesRow row =
command.ExecuteDataTable<DB.Companies>()[0]; return new Company(row);}
public static Company CreateNew(){ DB.Companies table = new DB.Companies(); return new Company((DB.CompaniesRow)table.NewRow());}
Data Mapper class Company{ public Company(int a_Id, string a_Alias, string a_FullName) { m_Id = a_Id; m_Alias = a_Alias; m_FullName = a_FullName; } int m_Id; public int Id { get { return m_Id; } } string m_Alias; public string Alias { get { return m_Alias; } set { m_Alias = value; } } string m_FullName; public string FullName { get { return m_FullName; } set { m_FullName = value; } } public void Save() { CompanyMapper.Instance.Save(m_Id, m_Alias, m_FullName); }}
Data Mapper (преобразователь данных)class CompanyMapper{ public static CompanyMapper Instance;
public Company Find(int a_Id) { XCommand command = Registry.DataBase.CreateCommand("select * from Companies where id
= @id"); command["id"].Value = a_Id; DataRow row = command.ExecuteDataRow(); return new Company((int)row["id"], (string)row["Alias"], (string)row["FullName"]); }
public void Save(int a_Id, string a_Name, string a_FullName) { XCommand command = Registry.DataBase.CreateCommand("update Companies set Alias =
@alias, FullName = @fullname where id = @id"); command["id"].Value = a_Id; command["alias"].Value = a_Name; command["fullname"].Value = a_FullName; command.ExecuteNonQuery(); }}
Объект запроса
Наследование с одной таблицей
Наследование с таблицами для каждого конкретного класса
Наследование с таблицами для каждого класса
Отображение внешних записей
Отображение внешних записей
XCompanyContacts m_Contacts = null;
public XCompanyContacts Contacts { get { if (m_Contacts == null) { m_Contacts = new XCompanyContacts(this); } return m_Contacts; } }
Отображение внешних записей
XObjectCollection<XCompany, XCompanyGroup, DB.xCompaniesToCategories> m_Groups = null;
public XObjectCollection<XCompany, XCompanyGroup, DB.xCompaniesToCategories> Groups
{ get { if (m_Groups == null) { m_Groups = new XObjectCollection<XCompany, XCompanyGroup,
DB.xCompaniesToCategories> (this, XCompanyGroupRepostitory.Instance, "id_Company", "id_Category"); } return m_Groups; }}
Московский финал Imagine Cup!
28 марта, офис компании Microsoft Russia