Исходный код вики Tools.Collections

Версия 9.1 от Alexandr Fokin на 2020/09/19 19:20

Скрыть последних авторов
Alexandr Fokin 1.1 1 Репозиторий: [[git repo>>https://git.denhome.ru/Repository/Detail/51601bfd-6f2c-40d8-88bb-f2724b294431]]
Alexandr Fokin 8.1 2 Platform: NetStandart 1.1
Alexandr Fokin 2.1 3
4 Данный проект реализует 2 коллекции.
Alexandr Fokin 6.1 5 Коллекции представляют из себя Key Value хранилище, являются потокобезопасными. (В основе лежит ConcurrentDictionary)
Alexandr Fokin 4.1 6 Для обеспечения оптимистичной блокировки в LinkStorage используется специальный item с полем Stamp, по которому проверяется не был ли изменен элемент во время операции.
7 (Подробнее смотри ConcurrentDictionary)
Alexandr Fokin 2.1 8
Alexandr Fokin 9.1 9 **1) LinkItemDictionary**
Alexandr Fokin 2.1 10 Интерфейс:
11
12 AddLink
13 TKey key - ключ
14 Func<TKey, TData> addFactory - фабрика для нового значения
15 Func<ILinkItem<TKey, TData>, TData> updateFactory - фабрика для обновления существующего значения
16
17 Если по ключу нет записи, то
18 добавить запись
19 счетчик записи = 1
20 вызвать addFactory(если не null) и заполнить value.Data
21 Иначе если по ключу есть запись, то
22 Увеличить счетчик на 1
23 вызвать updateFactory(если не null) и обновить value.Data
24
25
26 RemoveLink
27 TKey key - ключ
28 Func<ILinkItem<TKey, TData>, TData> updateFactory - фабрика для обновления существующего значения
29
Alexandr Fokin 7.1 30 вызвать updateFactory(если не null) и обновить value.Data
Alexandr Fokin 2.1 31 Уменьшить счетчик на 1
32 Если значение счетчика <= 0
33 То удалить запись
34
35
Alexandr Fokin 9.1 36 **2) ObjectLinkItemDictionary**
37 Данная коллекция оборачивает LinkItemDictionary, добавляя к контракту сущность объекта, ссылающегося на запись.
Alexandr Fokin 2.1 38 Все объекты, ссылающиеся на запись храняться в ImmutableHashSet.
39
40 При AddLink, помимо увеличения счетчика в HashSet записи добавляется ссылающийся объект.
41 При RemoveLink, помимо уменьшения счетчика из HashSet удаляется ссылающийся объект.
42
43 Ссылки:
Alexandr Fokin 5.1 44 [[Разработка/NET/C#/ConcurrentDictionary>>https://wiki.denhome.ru/bin/view/Разработка/NET/C%23/ConcurrentDictionary/]]
Alexandr Fokin 3.1 45 https://stackoverflow.com/questions/39679779/how-to-achieve-remove-if-functionality-in-net-concurrentdictionary
Alexandr Fokin 2.1 46
47