40
Архитектура корпоративных систем

Архитектура корпоративных систем

Embed Size (px)

DESCRIPTION

Лекция Михаила Гуренкова по архитектуре корпоративных систем в рамках курса по ООП. Каф. Вычислительная математика и программирование, МАИ.

Citation preview

Page 1: Архитектура корпоративных систем

Архитектура корпоративных систем

Page 2: Архитектура корпоративных систем

Планы на ближайшее время

30 марта — лабораторная работа №2

3 апреля — модульное тестирование

10 апреля — рефакторинг

17 апреля — разработка пользовательских интерфейсов

24 апреля — дизайн пользовательских интерфейсов (!!!)

Page 3: Архитектура корпоративных систем

Виды корпоративных приложений

Page 4: Архитектура корпоративных систем

Архитектура?

Page 5: Архитектура корпоративных систем

Архитектура

— представление системы программного обеспечения, процесс, а также и дисциплина, посвященные эффективной разработке проекта данной системы.

Page 6: Архитектура корпоративных систем

Модель OSI

Page 7: Архитектура корпоративных систем

Историческая справка

Page 8: Архитектура корпоративных систем

Историческая справка

— Все вместе

Page 9: Архитектура корпоративных систем

Историческая справка

— Клиентское приложение

— Сервер баз данных

Page 10: Архитектура корпоративных систем

Историческая справка

— Представление (presentation)

— Домен (предметная область)

— Источник данных

Page 11: Архитектура корпоративных систем

Задача

Page 12: Архитектура корпоративных систем
Page 13: Архитектура корпоративных систем

Организация логики предметной области

Page 14: Архитектура корпоративных систем

Сценарии транзакции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();

...}

Page 15: Архитектура корпоративных систем

Сценарии транзакции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(); }

Page 16: Архитектура корпоративных систем

Модуль таблицы

— DataSet

— DataTable

— DataRow

Page 17: Архитектура корпоративных систем

Модуль таблицы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);}

Page 18: Архитектура корпоративных систем

Модуль таблицы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);}

Page 19: Архитектура корпоративных систем

Модель предметной областиclass Cart{ public List<Item> Items;

public decimal GetTotalPrice();

public void Save();

...}

class Item{ public string Description;

public decimal Price;

…}

Page 20: Архитектура корпоративных систем

Модель предметной области

Cart cart = Cart.GetCurrent();

Item item = new Item(234);

cart.Items.Add(item);

cart.Save();

Page 21: Архитектура корпоративных систем

Модель предметной областиpublic decimal GetTotalPrice(){ decimal result = 0;

foreach(Item item in Items) { result += item.Price; }

return result;}

Page 22: Архитектура корпоративных систем

Модель предметной области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;}

Page 23: Архитектура корпоративных систем

Сравнение

Page 24: Архитектура корпоративных систем

:-)

Page 25: Архитектура корпоративных систем

Организация логики работы с базой данных

Page 26: Архитектура корпоративных систем

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); }}

Page 27: Архитектура корпоративных систем

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());}

Page 28: Архитектура корпоративных систем

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); }}

Page 29: Архитектура корпоративных систем

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(); }}

Page 30: Архитектура корпоративных систем

Объект запроса

Page 31: Архитектура корпоративных систем
Page 32: Архитектура корпоративных систем

Наследование с одной таблицей

Page 33: Архитектура корпоративных систем

Наследование с таблицами для каждого конкретного класса

Page 34: Архитектура корпоративных систем

Наследование с таблицами для каждого класса

Page 35: Архитектура корпоративных систем

Отображение внешних записей

Page 36: Архитектура корпоративных систем

Отображение внешних записей

XCompanyContacts m_Contacts = null;

public XCompanyContacts Contacts { get { if (m_Contacts == null) { m_Contacts = new XCompanyContacts(this); } return m_Contacts; } }

Page 37: Архитектура корпоративных систем

Отображение внешних записей

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; }}

Page 38: Архитектура корпоративных систем
Page 39: Архитектура корпоративных систем
Page 40: Архитектура корпоративных систем

Московский финал Imagine Cup!

28 марта, офис компании Microsoft Russia