Исходный код вики ManagetLinkCollection
Версия 7.1 от Alexandr Fokin на 2020/06/14 12:27
Последние авторы
author | version | line-number | content |
---|---|---|---|
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 | вызвать updateFactory(если не null) и обновить value.Data | ||
30 | Уменьшить счетчик на 1 | ||
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 |