Библиотеки - ManagetLinkCollection

Page / - Изменено Alexandr Fokin в 2020/06/14 12:34

ManagetLinkCollection

Изменено Alexandr Fokin

в 2020/06/14 12:34

Оглавление

Репозиторий: git repo
Platform: NetStandart 1.1

Данный проект реализует 2 коллекции.
Коллекции представляют из себя Key Value хранилище, являются потокобезопасными. (В основе лежит ConcurrentDictionary)
Для обеспечения оптимистичной блокировки в LinkStorage используется специальный item с полем Stamp, по которому проверяется не был ли изменен элемент во время операции.
(Подробнее смотри ConcurrentDictionary)

1) LinkStorage
Интерфейс:

AddLink
TKey key - ключ
Func<TKey, TData> addFactory - фабрика для нового значения
Func<ILinkItem<TKey, TData>, TData> updateFactory - фабрика для обновления существующего значения

Если по ключу нет записи, то
добавить запись
счетчик записи = 1
вызвать addFactory(если не null) и заполнить value.Data
Иначе если по ключу есть запись, то
Увеличить счетчик на 1
вызвать updateFactory(если не null) и обновить value.Data

RemoveLink
TKey key - ключ
Func<ILinkItem<TKey, TData>, TData> updateFactory - фабрика для обновления существующего значения

вызвать updateFactory(если не null) и обновить value.Data
Уменьшить счетчик на 1
Если значение счетчика <= 0
То удалить запись

2) ObjectLinkStorage
Данная коллекция оборачивает LinkStorage, добавляя к контракту сущность объекта, ссылающегося на запись.
Все объекты, ссылающиеся на запись храняться в ImmutableHashSet.

При AddLink, помимо увеличения счетчика в HashSet записи добавляется ссылающийся объект.
При RemoveLink, помимо уменьшения счетчика из HashSet удаляется ссылающийся объект.

Ссылки:
Разработка/NET/C#/ConcurrentDictionary
https://stackoverflow.com/questions/39679779/how-to-achieve-remove-if-functionality-in-net-concurrentdictionary