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

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

ManagetLinkCollection 
Изменено Alexandr Fokin
в 2020/06/14 12:09

Оглавление

Репозиторий: git repo
Данный проект реализует 2 коллекции.
Коллекцию представляют из себя Key Value хранилище, являются потокобезопасными. (В основе лежит 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 удаляется ссылающийся объект.
Ссылки:
https://wiki.denhome.ru/bin/view/Разработка/NET/C%23/ConcurrentDictionary/
https://stackoverflow.com/questions/39679779/how-to-achieve-remove-if-functionality-in-net-concurrentdictionary