SlideShare une entreprise Scribd logo
1  sur  89
Télécharger pour lire hors ligne
Что нам стоит DAL
построить?
Акуляков Артём
кто я есть
dotnet в основном
python в свободное время
functional programming еще
докладчик dotnetconf, d2d
организатор d2d
2
в чем проблема?
3
dal
data access layer
4
dal
data access layer
● persistence ignorance для bl
5
dal
data access layer
● persistence ignorance для bl
● обработка данных это ключевая функция
программы
6
dal
data access layer
● persistence ignorance для bl
● обработка данных это ключевая функция
программы
● большая часть проблем с
производительностью связана с доступом
к данным
7
противоречие
8
как построить dal?
9
repository
10
repository v1
public interface IRepository<TEntity>
where TEntity: class
{
IEnumerable<TEntity> GetAll();
TEntity GetById(int id);
void Add(TEntity obj);
void Update(TEntity obj);
void Remove(TEntity obj);
}
11
repository v1
public interface IPostsRepository : IRepository<Post>
{
Post GetByTitle(string title);
}
12
repository v1 # проблемы
● разрастание интерфейса
13
repository v1
public interface IPostsRepository : IRepository<Post>
{
Post GetByTitle(string title);
IEnumerable<Post> SearchByContent(string text);
IEnumerable<Post> GetOnlyWithComments();
… +100500 методов
}
14
repository v1 # проблемы
● разрастание интерфейса
● разрастание зависимостей
● разрастание ответственности
15
repository v1
public PostsRepository(IDbContext context,
ISearchEngine searchEngine,
ITokenizer tokenizer,
IPostComparator comparator,
ITransactionManager transactionManager,
… +100500 зависимостей)
{
…
}
16
что делать с операциями чтения?
17
IQueryable<T>
18
repository v2
public interface IRepository<TEntity>
where TEntity : class
{
IQueryable<TEntity> Query();
void Add(TEntity obj);
void Update(TEntity obj);
void Remove(TEntity obj);
}
19
repository v2
public IEnumerable<Post> GetActivePosts() {
return _repository.Query< Post>()
.Where(p => !p.IsDeleted)
.Include(p => p.Author).ToArray();
}
public IEnumerable<Post> GetTopPosts() {
return _repository.Query< Post>()
.Where(p => !p.IsDeleted)
.Where(p => p.Comments.Count() > 50)
.Include(p => p.Author).ToArray();
}
20
repository v2 # проблемы
● дублирование запросов
21
repository v2
public IEnumerable<Post> GetActivePosts() {
return _repository.Query< Post>()
.Where(p => !p.IsDeleted)
.Include(p => p.Author).ToArray();
}
public IEnumerable<Post> GetTopPosts() {
return _repository.Query< Post>()
.Where(p => !p.IsDeleted)
.Where(p => p.Comments.Count() > 50)
.Include(p => p.Author).ToArray();
}
22
repository v2 # проблемы
● дублирование запросов
● дублирование подгрузки
23
repository v2
public IEnumerable<Post> GetActivePosts() {
return _repository.Query< Post>()
.Where(p => !p.IsDeleted)
.Include(p => p.Author).ToArray();
}
public IEnumerable<Post> GetTopPosts() {
return _repository.Query< Post>()
.Where(p => !p.IsDeleted)
.Where(p => p.Comments.Count() > 50)
.Include(p => p.Author).ToArray();
}
24
include
- EntityFramework
- System.Data.Entity
- QueryableExtensions
- Include(...) + 2 overloads
25
repository v2 # проблемы
● дублирование запросов
● дублирование подгрузки
● include
26
specification
27
specification
public interface ISpecification<TEntity>
where TEntity : class
{
Expression<Func<TEntity, bool>> Filter { get; }
}
28
specification
public class NotDeleted : ISpecification<Post>
{
public Expression<Func<Post, bool>> Filter
{
get { return x => x.IsDeleted == false; }
}
}
29
repository v2 # уже лучше
public IEnumerable<Post> GetActivePosts() {
return _repository.Query< Post>()
.Where(_isActiveSpecification.Filter)
.Include(p => p.Author).ToArray();
}
public IEnumerable<Post> GetTopPosts() {
return _repository.Query< Post>()
.Where(_isActiveSpecification.Filter)
.Where(p => p.Comments.Count() > 50)
.Include(p => p.Author).ToArray();
}
30
немного “сахара”
public static IQueryable<TEntity>
Apply<TEntity>(this IQueryable<TEntity> query,
ISpecification<TEntity> spec)
where TEntity : class
{
return query.Where(spec.Filter);
}
31
repository v2 # еще лучше
public IEnumerable<Post> GetActivePosts() {
return _repository.Query< Post>()
.Apply(_isActiveSpecification)
.Include(p => p.Author).ToArray();
}
public IEnumerable<Post> GetTopPosts() {
return _repository.Query< Post>()
.Apply(_isActiveSpecification)
.Where(p => p.Comments.Count() > 50)
.Include(p => p.Author).ToArray();
}
32
repository v2 # проблемы
● дублирование запросов
● дублирование подгрузки
● include
33
collector
34
collector
public interface ICollector<TEntity>
where TEntity : class
{
IEnumerable<Expression<Func<TEntity, object>>> Includes
{
get;
}
}
35
collector
public class PostCollector : ICollector<Post>
{
public IEnumerable<Expression<Func<Post, object>>> Includes
{
get
{
yield return p => p.Author;
yield return p => p.Comments;
}
}
}
36
как применить collector с
repository?
37
collector
public interface IRepository<TEntity>
where TEntity : class;
{
IQueryable<TEntity> Query(
ICollector<TEntity> collector = null)
…
}
38
repository v2 # совсем хорошо
public IEnumerable<Post> GetTopPosts() {
return _repository
.Query<Post>(_postWithAuthorCollector)
.Apply(_onlyActiveSpecification)
.Where(p => p.Comments.Count() > 50)
.ToArray();
}
39
пример из реальной жизни
40
пример из жизни
public void BanAuthor(string login) {
var author = _authorsRep.Query().Single(a => a.Login == login);
var posts = _postsRep.Query().Where(p => p.Author.Id == author.Id);
foreach (var post in posts) {
post.IsDeleted = true;
_postsRep.Update(post);
}
author.Karma = 0;
author.IsReadOnly = true;
authorsRepository.Update(author);
} 41
unit of work
42
unit of work
public interface IUnitOfWork : IDisposable
{
void Commit();
}
43
repository
public interface IRepository<TEntity>
where TEntity : class
{
IQueryable<TEntity> Query(
ICollector<TEntity> collector = null);
void Add(TEntity obj);
void Remove(TEntity obj);
}
44
как связать unit of work и
repository?
45
unit of work + repository = factory
public interface IDalFactory
{
IRepository<TEntity> GetRepository<TEntity>()
where TEntity : class;
IUnitOfWork GetUnitOfWork();
}
46
unit of work
using (var uow = _dalFactory.GetUnitOfWork()){
var postsRep = _dalFactory.GetRepository< Post>();
var authorsRep = _dalFactory.GetRepository< Author>();
var author = authorsRep.Query().Single(a => a.Login == login);
var posts = postsRep.Query().Where(p => p.Author.Id == author.Id);
foreach (var post in posts) post.IsDeleted = true;
author.Karma = 0;
author.IsReadOnly = true;
uow.Commit();
} 47
profit?
48
итог
● repository
● unit of work
● factory
● specifications
● collectors
49
проблемы
● IQueryable<T> - дырявая абстракция
50
проблемы
● IQueryable<T> - дырявая абстракция
● cложно
51
проблемы
● IQueryable<T> - дырявая абстракция
● cложно
● много абстракций
52
как избавиться от этих
недостатков?
53
размышления
● cRud
54
размышления
● cRud
● масштабирование
55
масштабирование # как?
● индексы & оптимизация
56
масштабирование # как?
● индексы & оптимизация
● просто sql & Dapper.NET
57
масштабирование # как?
● индексы & оптимизация
● просто sql & Dapper.NET
● кластер
58
масштабирование # как?
● индексы & оптимизация
● просто sql & Dapper.NET
● кластер
● совсем не много денормализации
- много денормализации
- очень много денормализации
59
масштабирование # как?
● индексы & оптимизация
● просто sql & Dapper.NET
● кластер
● совсем не много денормализации
- много денормализации
- очень много денормализации
● NoSQL
- MongoDB, Redis, RavenDB, RethinkDB 60
как спроектировать dal
устойчивый к масштабированию?
61
нужно чуть больше супер силы
62
command-query responsibility
segregation
63
cqrs
64
command
-
query
dispatcher handler
cqrs
● commands & query
65
cqrs
public class PublishPostCommand : IValidatable {
public Guid PostUid { get; set; }
public DateTime PublishDate { get; set; }
…
}
public class PostsByDateQuery : IValidatable {
public DateTime PublicationDate { get; set; }
…
}
66
cqrs
● commands & queries
● handlers
67
cqrs
public interface ICommandHandler<in TCommand>
where TCommand : IValidatable
{
void Handle(TCommand command);
}
public interface IQueryHandler<in TQuery,out TResult>
where TQuery : IValidatable
{
TResult Handle(TQuery query);
}
68
cqrs # пример
public class PostByDateQueryHandler :
IQueryHandler<PostsByDateQuery, Post>
{
public PostByDateQueryHandler(IDbContext dbContext,
IMongoClient mongoClient)
{…}
public Post Handle(PostsByDateQuery query)
{…}
}
69
cqrs # можно реализовать bl
public class PostByDateQueryHandler :
IQueryHandler<PostsByDateQuery, Post>
{
public PostByDateQueryHandler(
IRepository<Post> dbContext,
IFullPostCollector collector)
{…}
public Post Handle(PostsByDateQuery query)
{…}
} 70
cqrs
● commands & queries
● handlers
● dispatcher
71
cqrs
public interface IDispatcher
{
void Dispatch<TCommand>(TCommand command)
where TCommand: IValidatable;
TResult Dispatch<TQuery, TResult>(TQuery query)
where TQuery : IValidatable;
}
72
cqrs # dispatcher
● ioc container
● message bus
● conventions
● …
73
cqrs # dispatcher
public class Dispatcher : IDispatcher {
…
public Dispatcher(IComponentContext componentContext)
{ _componentContext = componentContext; }
public void Dispatch<TCommand>(TCommand command)
where TCommand : IValidatable {
_componentContext
.Resolve<ICommandHandler <TCommand>>()
.Handle(command);
}
…
} 74
cqrs # используем
public Post ReadPost()
{
var query = new PostsByDateQuery
{
PublicationDate = DateTime.Now
};
return _dispatcher
.Dispatch<PostsByDateQuery, Post>(query);
}
75
cqrs
76
MyApp.Domain MyApp.DAL
Entites, Services,
Managers …
Commands
Queries
IDispatcher
IQueryHandler
ICommandHandler
CommandHandlers
QueryHandlers
Dispatcher
а что про масштабирование?
77
cqrs # масштабирование
78
db
ui
domain
dal
commands
dal : thin query model
queries
cqrs # масштабирование
79
write
db
ui
domain
dal
commands
dal : thin query model
queries
read
db
cqrs # масштабирование
80
write
db
ui
domain
dal
commands
dal : thin query model
queries
read
db
cqrs # достоинства
● очень чистый домен
81
cqrs # достоинства
● очень чистый домен
● сложность системы растет линейно
82
cqrs # достоинства
● очень чистый домен
● сложность системы растет линейно
● легко использовать специфичные
функции бд
83
cqrs # недостатки
● crud делать неудобно
84
cqrs # недостатки
● crud делать неудобно
● консистентность данных
85
cqrs # недостатки
● crud делать неудобно
● консистентность данных
● мало кто знает как готовить правильно
86
почитать
- http://cqrs.nu/
- http://martinfowler.com/bliki/CQRS.html
- http://blog.byndyu.ru/2014/07/command-and-query-responsibility.html
- http://blog.byndyu.ru/2014/05/blog-post.html
- http://blog.byndyu.ru/2013/03/dapper-queryobject-orm.html
- http://blog.byndyu.ru/2011/08/repository.html
- http://blog.byndyu.ru/2011/01/domain-driven-design-repository.html
- http://martinfowler.com/eaaCatalog/repository.html
- http://martinfowler.com/eaaCatalog/unitOfWork.html
- http://martinfowler.com/bliki/SpecificationByExample.html
- http://martinfowler.com/apsupp/spec.pdf
- http://blog.ploeh.dk/2012/03/26/IQueryableTisTightCoupling/
87
хорошая архитектура по - это
баланс между гибкостью и
сложностью
88
спасибо за внимание
akulyakov.artem@gmail.com
http://github.com/0xffaa
http://vk.com/oxffaa

Contenu connexe

Tendances

C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7Technopark
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1Technopark
 
Расширь границы возможного вместе с Gradle
Расширь границы возможного вместе с GradleРасширь границы возможного вместе с Gradle
Расширь границы возможного вместе с GradleAleksandr Tarasov
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.Igor Shkulipa
 
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NETЭволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NETDev2Dev
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterAleksandr Tarasov
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыYandex
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.Igor Shkulipa
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Dima Dzuba
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ontico
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхKirill Zotin
 
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency InjectionPlatonov Sergey
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.Igor Shkulipa
 

Tendances (20)

C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Расширь границы возможного вместе с Gradle
Расширь границы возможного вместе с GradleРасширь границы возможного вместе с Gradle
Расширь границы возможного вместе с Gradle
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.
 
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NETЭволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
Bytecode
BytecodeBytecode
Bytecode
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталях
 
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency Injection
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 

Similaire à Что нам стоит DAL построить? Акуляков Артём D2D Just.NET

Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИСРеактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС2ГИС Технологии
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияMatvey Malkov
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderАлександр Брич
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)Ontico
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsqlAnatoly Popov
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCDevDay
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8chashnikov
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs ReflectionDenis Tsvettsih
 
Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл ХарьковCodeFest
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle IntroductionKirill Rozov
 
Service Discovery. More that it seems
Service Discovery. More that it seemsService Discovery. More that it seems
Service Discovery. More that it seemsAleksandr Tarasov
 

Similaire à Что нам стоит DAL построить? Акуляков Артём D2D Just.NET (20)

Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИСРеактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложения
 
Tdd php
Tdd phpTdd php
Tdd php
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, Loader
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
Coding like a sex
Coding like a sexCoding like a sex
Coding like a sex
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsql
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
 
Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл Харьков
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Service Discovery. More that it seems
Service Discovery. More that it seemsService Discovery. More that it seems
Service Discovery. More that it seems
 

Plus de Dev2Dev

D2D Чипец 2 Николай Иванов - Data Informed Design
D2D Чипец 2 Николай Иванов - Data Informed DesignD2D Чипец 2 Николай Иванов - Data Informed Design
D2D Чипец 2 Николай Иванов - Data Informed DesignDev2Dev
 
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проект
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проектD2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проект
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проектDev2Dev
 
D2D Чипец 2 Виталий Мазуревич - Engeneering design
D2D Чипец 2 Виталий Мазуревич - Engeneering designD2D Чипец 2 Виталий Мазуревич - Engeneering design
D2D Чипец 2 Виталий Мазуревич - Engeneering designDev2Dev
 
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...Dev2Dev
 
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"Dev2Dev
 
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скуки
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скукиD2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скуки
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скукиDev2Dev
 
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...Dev2Dev
 
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"Dev2Dev
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"Dev2Dev
 
D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"Dev2Dev
 
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"Dev2Dev
 
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"Dev2Dev
 
Всё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NETВсё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NETDev2Dev
 
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NETNemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NETDev2Dev
 
Трудности повторного использования
Трудности повторного использованияТрудности повторного использования
Трудности повторного использованияDev2Dev
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + RetrofitDev2Dev
 
Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.Dev2Dev
 
Разработка приложений в Android studio
Разработка приложений в Android studioРазработка приложений в Android studio
Разработка приложений в Android studioDev2Dev
 
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...Dev2Dev
 
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015Dev2Dev
 

Plus de Dev2Dev (20)

D2D Чипец 2 Николай Иванов - Data Informed Design
D2D Чипец 2 Николай Иванов - Data Informed DesignD2D Чипец 2 Николай Иванов - Data Informed Design
D2D Чипец 2 Николай Иванов - Data Informed Design
 
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проект
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проектD2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проект
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проект
 
D2D Чипец 2 Виталий Мазуревич - Engeneering design
D2D Чипец 2 Виталий Мазуревич - Engeneering designD2D Чипец 2 Виталий Мазуревич - Engeneering design
D2D Чипец 2 Виталий Мазуревич - Engeneering design
 
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...
 
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"
 
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скуки
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скукиD2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скуки
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скуки
 
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
 
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
 
D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"
 
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
 
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
 
Всё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NETВсё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NET
 
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NETNemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET
 
Трудности повторного использования
Трудности повторного использованияТрудности повторного использования
Трудности повторного использования
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
 
Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.
 
Разработка приложений в Android studio
Разработка приложений в Android studioРазработка приложений в Android studio
Разработка приложений в Android studio
 
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
 
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015
 

Что нам стоит DAL построить? Акуляков Артём D2D Just.NET