Скачать презентацию Введение в архитектуру ПО Что такое архитектура Скачать презентацию Введение в архитектуру ПО Что такое архитектура

Introduction to Software Architecture.pptx

  • Количество слайдов: 11

Введение в архитектуру ПО Введение в архитектуру ПО

Что такое архитектура ПО? Software application architecture is the process of defining a structured Что такое архитектура ПО? Software application architecture is the process of defining a structured solution that meets all of the technical and operational requirements, while optimizing common quality attributes such as performance, security, and manageability. It involves a series of decisions based on a wide range of factors, and each of these decisions can have considerable impact on the quality, performance, maintainability, and overall success of the application. Microsoft Application Architecture Guide, 2 nd Edition

Компоненты Enterprise приложения • Основная логика • • Presentation Layer Business Layer Data Layer Компоненты Enterprise приложения • Основная логика • • Presentation Layer Business Layer Data Layer Crosscutting компоненты • • • Authentication Authorization Caching Communication Configuration Management Exception Management Logging and Instrumentation State Management Validation

Реализация основной бизнес-логики По Patterns of Enterprise Application Architecture, Martin Fowler: • Transaction Script Реализация основной бизнес-логики По Patterns of Enterprise Application Architecture, Martin Fowler: • Transaction Script • Table Module • Domain Model

Архитектура, пригодная к тестированию Проблема – зависимости (особенно от инфраструктуры) public class User. BC Архитектура, пригодная к тестированию Проблема – зависимости (особенно от инфраструктуры) public class User. BC { public void Save. User(User. Info user) { user. Validate(); User. Dao dao. User = new User. Dao(); if (user. Is. New) dao. User. Insert(user); else dao. User. Update(user); } } В представленном коде: • Код сам создает классы доступа к данным (или иные другие зависимые) • Нет возможности вмешаться в цепочку создания/вызова объектов • Приходится строить полную инфраструктуру (от UI до базы)

Разнесение зависимостей и «заместители» public class User. BC { private IUser. Dao _dao. User; Разнесение зависимостей и «заместители» public class User. BC { private IUser. Dao _dao. User; public class User. Dao. Stub : IUser. Dao { private IUser. Info _user. Result = null; public User. BC() { _dao. User = new User. Dao(); } public IUser. Info User. Result { get { return _user. Result; } set { _user. Result = value; } } public User. BC(IUser. Dao dao. User) { _dao. User = dao. User; } public void Insert(IUser. Info user) { user. ID = User. Result. ID; user. Name = User. Result. Name; //. . . } public void Save. User(IUser. Info user) { user. Validate(); if (user. Is. New) _dao. User. Insert(user); else _dao. User. Update(user); } } public void Update(IUser. Info user) { //. . . } }

Альтернатива: мокирование [Test. Method()] public void Save. New. User. Test() { var user. Info. Альтернатива: мокирование [Test. Method()] public void Save. New. User. Test() { var user. Info. Mock = new Mock(); user. Info. Mock. Setup(u => u. Validate()); user. Info. Mock. Setup(u => u. Is. New). Returns( true); var user. Dao. Mock = new Mock(); user. Dao. Mock. Setup(u => u. Insert(It. Is. Any())); var user. BC = new User. BC(user. Dao. Mock. Object); user. BC. Save. User(user. Info. Mock. Object); } [Test. Method()] public void Save. Updated. User. Test() { var user. Info. Mock = new Mock(); user. Info. Mock. Setup(u => u. Validate()); user. Info. Mock. Setup(u => u. Is. New). Returns( false); var user. Dao. Mock = new Mock(); user. Dao. Mock. Setup(u => u. Update(It. Is. Any())); var user. BC = new User. BC(user. Dao. Mock. Object); user. BC. Save. User(user. Info. Mock. Object); }

Некоторые фреймворки для мокирования • Moq http: //code. google. com/p/moq/ • NMock http: //nmock. Некоторые фреймворки для мокирования • Moq http: //code. google. com/p/moq/ • NMock http: //nmock. org/ • Isolator. NET http: //www. typemock. com/ • Microsoft Moles http: //research. microsoft. com/en-us/projects/moles/

Упрощение тестирование = усложнение инициализации? Упрощение тестирование = усложнение инициализации?

DI/Io. C контейнеры static void Main() { var builder = new Container. Builder(); builder. DI/Io. C контейнеры static void Main() { var builder = new Container. Builder(); builder. Register. Type(). As(); builder. Register. Type(). As(); builder. Register( u => new User. Info() { Name = "New User", Age = 0 }). As(); var container = builder. Build(); var user. BC = container. Resolve(); var user = container. Resolve(); user. BC. Save. User(user); } • Резолвинг прямых и непрямых зависимостей • Управление временем жизни

DI/Io. C контейнеры • Autofac http: //code. google. com/p/autofac/ • Unity (Microsoft Patterns & DI/Io. C контейнеры • Autofac http: //code. google. com/p/autofac/ • Unity (Microsoft Patterns & Practices) http: //unity. codeplex. com/ • Spring. NET http: //www. springframework. net/ • MEF (Managed Extensibility Framework) http: //msdn. microsoft. com/en-us/library/dd 460648. aspx