Исходный код вики ManagetLinkCollection

Версия 5.2 от Alexandr Fokin на 2020/06/14 12:17

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