Исходный код вики ManagetLinkCollection
Версия 5.2 от Alexandr Fokin на 2020/06/14 12:17
Последние авторы
| 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 | Уменьшить счетчик на 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 |