ORM Паттерны. Repository Repository (хранилище) ― выступает в роли посредника между слоем домена и слоем отображения данных, предоставляя интерфейс в.

Slides:



Advertisements
Similar presentations
EXtreme Programming XP Тема 3. XP Пусть есть некоторая информационная система для банков. В качестве основной валюты для расчетов используется доллар,
Advertisements

And so to Code. Forward, Reverse, and Round-Trip Engineering Forward Engineering Reverse Engineering Round-Trip Engineering.
Пример реализации приложения Программа отправки и анализа SMS-сообщений (через с WEB-интерфейсом.
EXtreme Programming XP Тема 11. XP Для работы по администрированию таблицы Department создаем классы: DepartmentListController; EnterDepartmentController;
Class Scope class Student { private: string id; string firstName, lastName; float gpa; public: void Read() { cin >> id >> firstName >> lastName >> gpa;
ООП Классы. Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void.
Астрометрические каталоги К.В.Куимов, ГАИШ МГУ. Определение астрометрического каталога Астрометрический каталог – понятие неопределённое. Например, это.
Схема распределения грантов городам-участникам программы Тасис (TCAS) Экологические гранты для муниципалитетов.
Разработка программного обеспечения (Software Engineering) Ian Sommervillle Часть 4. Реализация ПО: Проектирование с повторным использованием компонентов.
Автоматическая генерация кода программ с явным выделением состояний Канжелев С.Ю. магистрант СПбГУ ИТМО Шалыто А.А. доктор технических наук профессор СПбГУ.
Процесс дублирования. Цели Проект профессиональных технических знаний Возможность опознать проблемы Возможность сделать правильные рекомендации.
Системы с наследованием. Если систему можно представить в виде : Где - непрерывные функции, то такая система называется системой с наследованием. Математическое.
Некомпенсаторное агрегирование и рейтингование студентов Авторы: Гончаров Алексей Александрович, Чистяков Вячеслав Васильевич. НФ ГУ ВШЭ 2010 год.
ПРИНЦИПЫ РАЗРАБОТКИ СИСТЕМЫ КЛАССА LEARNING MANAGEMENT SYSTEM И ОПЫТ ЕЕ ИСПОЛЬЗОВАНИЯ НА ФАКУЛЬТЕТЕ МЕНЕДЖМЕНТА Афанасьева С.В. Кафедра бизнес-информатики.
Неотрицательное решение задачи Коши. Нередко постановка задачи требует чтобы фазовые переменные принимали лишь неотрицательные значения. Так, в физических.
Всевоволод Головизнин, MVC – паттерн проектирование, в котором бизнес - логика, управляющая логика и интерфейс разделены на три отдельных компонента.
Определение необходимого уровня запасов на складе.
Сохранение суммы фазовых координат. Важный частный случай представляют системы, в которых в течение всего процесса сохраняется постоянной сумма значений.
Создание сервиса синхронизации разнородных баз данных Допущена к защите зав. кафедрой: д.ф.м.н., профессор Терехов А.Н. Научный руководитель: доцент Графеева.
ООП Классы – 2. Ссылки Ссылка – еще одно имя объекта. Используйте ссылки вместо указателя. Это более безопасно. Complex c(10,10); Complex c2& = c; c2+=10;
Блок 3. Семейства белков I. Множественное выравнивание Первый курс, весна 2008, А.Б.Рахманинова.
Особенности Java. Блок static static { } Создание и уничтожение объектов  new – создание объекта  finalyze()
Ответы на вопросы 7 июля « Подготовка паспортов безопасности» тел: (495) Экологический Синтезирующий.
1 Генерация контекстных ограничений для баз данных Выполнил: Жолудев В. Научный руководитель: Терехов А.Н. Рецензент: Иванов А.Н.
Основы цифровой обработки речевых сигналов. Общая схема процесса речеобразования x[n] – дискретные отсчеты сигнала возбуждения y[n] – дискретные отсчеты.
Программирование на стороне сервера. Языки для программирования на стороне сервера Языки программирования: Perl PHP Java Технология Microsoft для использования.
 Нужно много различных протоколов связи  Каждый из них может реализовываться на разных платформах Современные сети Много устройств, компьютеров и сетей.
"The European Molecular Biology Open Software Suite"
Контейнеры. Сортировка  Метод sort()  Интерфейс Comparable метод int compareTo(Object o) вызов: Arrays.sort(a)  Интерфейс Comparator метод int compare(Object.
Оптимизация Just – in - time компилятора методом профилирования значений Соколов Андрей Владимирович, ФФ НГУ, 3 курс, Руководитель:
Пользовательские действия (custom actions) в JSP. JSTL.
Особенности языка JavaScript и его использования.
Увеличение модульности программного обеспечения на языке Java Курсовая работа студента 345 группы Абишева Тимура Маратовича Научный руководитель: Профессор.
Анализ и Проектирование качественных приложений Презентация по книге Крэга Лармана.
Применение генетических алгоритмов к генерации тестов для автоматных программ Законов Андрей Юрьевич Научный руководитель: Степанов Олег Георгиевич, к.т.н.,
Коллекции. Пространство имен System.Collections Наиболее простой вариант набора элементов — это массив System. Array. Он уже обладает весьма полезными.
Проект «Безопасный браузер» Визовитин Николай Кадашев Дмитрий.
Демидов А.В г. Операционные системы Лекция 4 Работа с файлами.
1 (с) ИТЛаб, ННГУ, ВМК, 2003г Java 2 Micro Edition Жерздев С.В. Java 2 Micro Edition Лаборатория информационных технологий (ИТЛаб) При поддержке фирмы.
ВВЕДЕНИЕ В ВЫЧИСЛИТЕЛЬНУЮ МАТЕМАТИКУ Лекция 5 6 октября 2009 ВЫЧИСЛИТЕЛЬНАЯ ЛИНЕЙНАЯ АЛГЕБРА.
XML - расширенный язык разметки Моисеевой О. Макушиной Д. (eXtensible Markup Language)
Модели одностороннего риска в анализе доходности собственного капитала Подготовила: Шутова Е. С. Научный руководитель: Профессор, д.э.н. Теплова Т.В.
XML Схемы XML документов. XML Schema созданая Microsoft позволяет избавиться от DTD блоков. Основа – использование пространств имен и очень точная типизация.
Обработка исключений в C# Единая техника обнаружения ошибок времени выполнения и передачи информации о них.
Microsoft TechDayshttp:// Александр Шаповал Эксперт по стратегическим технологиям
Microsoft TechDayshttp:// Александр Шаповал Эксперт по стратегическим технологиям
Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет Обнинск, 2004.
Windows Camp #wincamp Windows Camp Сергей Гребнов Ведущий разработчик, Akvelon / Microsoft AllJoyn и Windows 10 — делаем так, чтобы наши устройства.
КРУПНЕЙШАЯ ТЕХНИЧЕСКАЯ КОНФЕРЕНЦИЯ MICROSOFT В УКРАИНЕ Metro приложения: работа с данными Краковецкий Александр, MVP/RD/PhD. DevRain Solutions.
Максим Павловский
Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");
Final Presentation SoftServe IT Academy Yemel’yanenko Tatiana DP-024.AQC Oct
HTTP ANDROID CLUB 2015.
СОСТАВЛЕНИЕ ОПТИМАЛЬНОГО ПЛАНА ПРОДАЖ НА ПРИМЕРЕ МНОГОКВАРТИРНОГО ДОМА ЖДАНОВА МАРИЯ 4 КУРС, НИУ ВШЭ СПБ, СПБШЭМ, ДЕПАРТАМЕНТ ЭКОНОМИКИ ГРУППА « АНАЛИТИЧЕСКАЯ.
Anekdot ANDROID CLUB Сегодня  Navigation Drawer  CardView  Calligraphy  TextToSpeech.
PRINCIPLES OF OBJECT ORIENTED DESIGN S.O.L.I.D. S.O.L.I.D Principles What is SOLID?  Acrostic of 5 Principles:  The Single Responsibility Principle.
NHibernate что, где, когда Артур Дробинский ЗетаСофт Томск, 2012.
«Центр Разработки и Внедрения Террасофт Поволжье»
Int fact (int n) { If (n == 0) return 1; else return n * fact (n – 1); } 5 void main () { Int Sum; : Sum = fact (5); : } Factorial Program Using Recursion.
Microsoft TechDayshttp:// Сергей Звездин
Современные технологии баз данных Лекция 7. Объектно-реляционное отображение (ORM) Технология отображения объектов какого- либо объектно-ориентированного.
CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics Advanced.NET Programming I 2 nd Lecture Pavel Ježek
Современные технологии баз данных
Сергей Копорулин | Эксперт по технологиям | Microsoft
Сетевое взаимодействие
Conditional Statements
ASP.NET 4 Сергей Байдачный специалист по разработке ПО
November CTP Андрей Коршиков MCP-клуб, Краснодар Декабрь 2009.
Прогнозирование физико-химических свойтсв органических соеденений на основнании их химических строения экпериментально- статисттческими методами Органикалық.
Решение типовых расчетных задач по формулам. Определение массовой доли элементов Массовая доля элемента ω(Э) % - это отношение массы данного элемента.
Presentation transcript:

ORM Паттерны

Repository Repository (хранилище) ― выступает в роли посредника между слоем домена и слоем отображения данных, предоставляя интерфейс в виде коллекции для доступа к объектам домена.

Пример Обратимся к упомянутому ранее примеру на NHibernate. Пусть у нас определн класс автора: public class Author { public virtual int Id { get; set; } public virtual string FirstName { get; set; } public virtual string LastName { get; set; } public virtual int YearOfBirth { get; set; } public virtual Iesi.Collections.Generic.ISet Books { get; set; } }

Пример Файл, который отображает класс автора на таблицу БД: <property name="YearOfBirth" type="System.Int32" column="YearOfBirth"/> <many-to-many class ="Books.Domain.Book, NHibernateDemo" column="BookId">

Пример Пусть нам необходимо заполнить выпадающий список именами авторов, скажем, для того чтобы впоследствии вывести список всех его работ: public void FillAuthorsComboBox(ComboBox comboBox, ISessionFactory factory) { ISession session = factory.OpenSession(); try { IQuery authorsQuery = session.CreateQuery("FROM Author"); IList authors = authorsQuery.List (); foreach (Author author in authors) comboBox.Items.Add(author.LastName + ", " + author.FirstName); } finally { session.Close(); }}}}

Пример Пусть одной из функций нашего приложения является вывод информации о всех авторах в формате HTML: public string GetAllAuthorsAsHTML(ISessionFactory factory) { ISession session = factory.OpenSession(); try { IQuery authorsQuery = session.CreateQuery("FROM Author"); IList authors = authorsQuery.List (); StringBuilder result = new StringBuilder(); result.Append(" ").Append(" "); foreach (Author author in authors) { result.Append(" ").Append(author.LastName + ", " + author.FirstName).Append(" "); result.Append(" Year of birth: ").Append(author.YearOfBirth.ToString()).Append(" "); } result.Append(" ").Append(" "); return result.ToString(); } finally { session.Close(); }}}}

Пример Недостатки использованного подхода: неоправданное дублирование; зависимость от конкретной реализации ORM; непрозрачность кода; невозможность протестировать код.

Схема

Пример Определим класс Repository: public class Repository { private ISession session; public Repository(ISession session) { this.session = session; } public IEnumerable GetAllAuthors() { IQuery authorsQuery = session.CreateQuery("FROM Author"); return authorsQuery.List (); }}}}

Пример Теперь функции, которые работают со списком авторов, можно переписать следующим образом: public void FillAuthorsComboBox( ComboBox comboBox, Repository repository) { IEnumerable authors = repository.GetAllAuthors(); foreach (Author author in authors) comboBox.Items.Add( author.LastName + ", " + author.FirstName); }

Пример Функция экспорта в HTML преобразуется следующим образом: public string GetAllAuthorsAsHTML(Repository repository) { IEnumerable authors = repository.GetAllAuthors(); StringBuilder result = new StringBuilder(); result.Append(" ").Append(" "); foreach (Author author in authors) { result.Append(" ").Append(author.LastName + ", " + author.FirstName).Append(" "); result.Append(" Year of birth: ").Append(author.YearOfBirth.ToString()).Append(" "); } result.Append(" ").Append(" "); return result.ToString(); }

Плюсы Сокращение дублирования; прозрачность кода; возможность создания фиктивного хранилища для упрощения тестирования; скрытие деталей реализации.

Specification Specification (спецификация) ― паттерн, который инкапсулирует логику отбора доменных объектов в отдельный объект.

Specification

Specification. Пример Предположим, что нам необходимо делать выборки авторов, удовлетворяющие разным критериям. Например, выбирать авторов, родившихся в определнный период или имя которых содержит заданное значение: public class Repository { public IEnumerable FindAuthors_BornBetween(int startYear, int endYear) { return session.QueryOver ().Where(a => a.YearOfBirth >= startYear && a.YearOfBirth (); } public IEnumerable FindAuthors_NameContains(string value) { return session.QueryOver ().Where(a => a.FirstName.Contains(value)).List (); }}}} Интерфейс класса Repository может стать неоправданно большим. Кроме того, такая реализация нарушает принцип открытости/закрытости.

Specification. Пример Решением является использование паттерна Спецификация. Рассмотрим пример применения данного паттерна: public interface ISpecification { Expression > IsSatisfiedBy(); } public class Repository { public IEnumerable FindAuthors( ISpecification specification) { return session.QueryOver ().Where(specification.IsSatisfiedBy()).List (); }}}}

Specification. Пример Класс, реализующий интерфейс спецификации и выполняющий проверку даты рождения на вхождение в определнный диапазон, будет выглядеть так: public class IsYearOfBirthInRange : ISpecification { private int endYear; private int startYear; public IsYearOfBirthInRange(int startYear, int endYear) { this.startYear = startYear; this.endYear = endYear; } public Expression > IsSatisfiedBy() { return author => author.YearOfBirth >= startYear && author.YearOfBirth <= endYear; }}}}

Specification. Пример Класс, реализующий интерфейс спецификации и анализирующий имя автора, будет следующим: public class AuthorNameContains : ISpecification { private string value; public AuthorNameContains(string value) { this.value = value; } public Expression > IsSatisfiedBy() { return author => author.FirstName.Contains(value); }}}}

Specification. Пример Рассмотрим теперь пример использования полученных классов. Выведем всех авторов, родившихся во второй половине XX века: public void DisplayAuthors(Repository repository) { IEnumerable authors = repository.FindAuthors(new IsYearOfBirthInRange(1950, 2000)); foreach (Author author in authors) Console.WriteLine(author.FirstName + " " + author.LastName); }

Specification Для того чтобы сделать выборку, удовлетворяющую нескольким условиям, можно применить паттерны компоновщик и декоратор следующим образом:

Specification Интерфейс спецификации следует расширить следующим образом: public interface ISpecification { Expression > IsSatisfiedBy(); ISpecification Or(ISpecification left); ISpecification And(ISpecification left); ISpecification Not(); }

Specification Класс составного условия будет следующим: public abstract class CompositeSpecification : ISpecification { public abstract Expression > IsSatisfiedBy(); public ISpecification Or(ISpecification right) { return new OrSpecification (this, right); } public ISpecification And(ISpecification right) { return new AndSpecification (this, right); } public ISpecification Not() { return new NotSpecification (this); }}}}

Specification Рассмотрим реализацию наследников упомянутого выше класса. Класс AndSpecification будет следующим: public class AndSpecification : CompositeSpecification { private ISpecification left; private ISpecification right; public AndSpecification(ISpecification left, ISpecification right) { this.left = left; this.right = right; } public override Expression > IsSatisfiedBy() { return Expression.Lambda >( Expression.And( left.IsSatisfiedBy(), right.IsSatisfiedBy())); }}}}

Specification Класс OrSpecification: public class OrSpecification : CompositeSpecification { private ISpecification left; private ISpecification right; public OrSpecification(ISpecification left, ISpecification right) { this.left = left; this.right = right; } public override Expression > IsSatisfiedBy() { return Expression.Lambda >( Expression.Or( left.IsSatisfiedBy(), right.IsSatisfiedBy())); }}}}

Specification Класс NotSpecification: public class NotSpecification : CompositeSpecification { private ISpecification wrapped; public NotSpecification(ISpecification wrapped) { this.wrapped = wrapped; } public override Expression > IsSatisfiedBy() { return Expression.Lambda >( Expression.Not(wrapped.IsSatisfiedBy())); }}}}

Specification Теперь классы конкретных условий должны наследовать класс CompositeSpecification: public class IsYearOfBirthInRange : CompositeSpecification { private int endYear; private int startYear; public IsYearOfBirthInRange(int startYear, int endYear) { this.startYear = startYear; this.endYear = endYear; } public override Expression > IsSatisfiedBy() { return author => author.YearOfBirth >= startYear && author.YearOfBirth <= endYear; }}}}

Specification Рассмотрим пример использования. Выберем всех авторов, которые родились не в первой половине XX века и имя которых содержит букву «А»: public static void DisplayAuthors(Repository repository) { ISpecification condition = ( (new IsYearOfBirthInRange(1950, 1999)).Not() ).And ( new AuthorNameContains("A") ); IEnumerable authors = repository.FindAuthors(condition); foreach (Author author in authors) Console.WriteLine(author.FirstName + " " + author.LastName); }

Specification Такая возможность языка C# 3.0, как методы расширения позволяет реализовать подобную функциональность следующим образом: public static class SpecificationUtils { public static ISpecification Or (this ISpecification left, ISpecification right) { return new OrSpecification (left, right); } public static ISpecification And (this ISpecification left, ISpecification right) { return new AndSpecification (left, right); } public static ISpecification Not (this ISpecification wrapped) { return new NotSpecification (wrapped); }}}}

Specification Класс AndSpecification будет выглядеть так: Остальные подобные классы реализуются аналогично. public class AndSpecification : ISpecification { private ISpecification left; private ISpecification right; public AndSpecification(ISpecification left, ISpecification right) { this.left = left; this.right = right; } public Expression > IsSatisfiedBy() { return Expression.Lambda >( Expression.And( left.IsSatisfiedBy(), right.IsSatisfiedBy())); }}}}

Specification Клиентский код остатся без изменений: public static void DisplayAuthors(Repository repository) { ISpecification condition = ( (new IsYearOfBirthInRange(1950, 1999)).Not() ).And ( new AuthorNameContains("A") ); IEnumerable authors = repository.FindAuthors(condition); foreach (Author author in authors) Console.WriteLine(author.FirstName + " " + author.LastName); }