ManagetLinkCollection

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

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

Данный проект реализует 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 - фабрика для обновления существующего значения

Уменьшить счетчик на 1
вызвать updateFactory(если не null) и обновить value.Data
Если значение счетчика <= 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