ObjectRepository - αž‚αŸ†αžšαžΌαžƒαŸ’αž›αžΆαŸ†αž„αž€αŸ’αž“αž»αž„αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† .NET αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž•αŸ’αž‘αŸ‡αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αž αŸαžαž»αž’αŸ’αžœαžΈαžαŸ’αžšαžΌαžœαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž€αŸ’αž“αž»αž„αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†?

αžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‚αŸαž αž‘αŸ†αž–αŸαžš αž¬αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™ αž”αŸ†αžŽαž„αž”αŸ’αžšαžΆαžαŸ’αž“αžΆαžŠαŸ†αž”αžΌαž„αžšαž”αžŸαŸ‹αž˜αž“αž»αžŸαŸ’αžŸαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαžΆαž‡αŸ’αž‰αžΆαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž‚αžΊαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ SQL αŸ” 

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž–αŸαž›αžαŸ’αž›αŸ‡αž€αžΆαžšαž‚αž·αžαž˜αž€αž€αŸ’αž“αž»αž„αž…αž·αžαŸ’αžαžαžΆαž‚αŸ†αžšαžΌαž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž·αž“αžŸαž˜αžšαž˜αŸ’αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ SQL αž‘αŸαŸ– αž§αž‘αžΆαž αžšαžŽαŸ αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€ αž¬αž€αŸ’αžšαžΆαž αŸ’αžœαžŸαž„αŸ’αž‚αž˜ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŸαŸ’αžœαŸ‚αž„αžšαž€αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰αžšαžœαžΆαž„αžœαžαŸ’αžαž»αŸ” 

αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸαž’αžΆαž€αŸ’αžšαž€αŸ‹αž”αŸ†αž•αž»αžαž‚αžΊαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž€αŸ’αžšαž»αž˜ αž αžΎαž™αž˜αž·αžαŸ’αžαžšαž½αž˜αž€αžΆαžšαž„αžΆαžšαž˜αž·αž“αžŠαžΉαž„αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαž½αžšαžšαž αŸαžŸαŸ” αžαžΎαž’αŸ’αž“αž€αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆ N+1 αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž›αž·αž”αž·αž€αŸ’αžšαž˜αž”αž“αŸ’αžαŸ‚αž˜αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™ SELECT αž“αŸ…αž›αžΎαž‘αŸ†αž–αŸαžšαž˜αŸαž“αžΉαž„αž”αž‰αŸ’αž…αž”αŸ‹αž€αŸ’αž“αž»αž„αž”αžšαž·αž˜αžΆαžŽαžŸαž˜αž αŸαžαž»αž•αž›?

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸαž–αŸαž‰αž“αž·αž™αž˜αž˜αž½αž™αž‘αŸ€αžαž‚αžΊ NoSQL αŸ” αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αž†αŸ’αž“αžΆαŸ†αž˜αž»αž“αž˜αžΆαž“αž€αžΆαžšαžƒαŸ„αžŸαž“αžΆαž”αŸ†αž•αŸ’αž›αžΎαžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž‡αž»αŸ†αžœαž·αž‰αž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸαŸ‡ - αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž±αž€αžΆαžŸαž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ MongoDB αž αžΎαž™αžšαžΈαž€αžšαžΆαž™αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž…αž˜αŸ’αž›αžΎαž™αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž‡αžΆαž―αž€αžŸαžΆαžš json (αžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡ αžαžΎαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαžΆαž€αŸ‹αžˆαžΎαž…αŸ’αžšαžαŸ‹αž…αŸ†αž“αž½αž“αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“ αžŠαŸ„αž™αžŸαžΆαžšαžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αžšαž„αŸ’αžœαž„αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš?).

αžαŸ’αž‰αž»αŸ†αžŸαŸ’αž“αžΎαž±αŸ’αž™αžŸαžΆαž€αž›αŸ’αž”αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž‡αŸ†αž“αž½αžŸαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž - αž αŸαžαž»αž’αŸ’αžœαžΈαž˜αž·αž“αž–αŸ’αž™αžΆαž™αžΆαž˜αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŠαŸ„αž™αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžœαžΆαž‡αžΆαž‘αŸ€αž„αž‘αžΆαžαŸ‹αž‘αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αž…αŸƒαžŠαž“αŸ’αž™ (αž―αž€αžŸαžΆαžš αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž…αž˜αŸ’αž„αžΆαž™)? 

αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‘αŸ…αž‡αžΆαžαŸ„αž€ αž αžΎαž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αžαŸ’αž“αžΆαžαžαžΌαž… αž“αž·αž„αž˜αž’αŸ’αž™αž˜αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž“αžΉαž„αžŸαž˜αž“αžΉαž„αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† 1 GB αŸ” (αž§αž‘αžΆαž αžšαžŽαŸ αž‚αž˜αŸ’αžšαŸ„αž„αž•αŸ’αž‘αŸ‡αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž…αžΌαž›αž…αž·αžαŸ’αžαž‚αžΊ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž˜αžŠαžΆαž“αž αž·αžšαž‰αŸ’αž‰αžœαžαŸ’αžαž»αžŠαŸ‚αž›αžšαž€αŸ’αžŸαžΆαžŸαŸ’αžαž·αžαž·αž”αŸ’αžšαž…αžΆαŸ†αžαŸ’αž„αŸƒ αž“αž·αž„αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸƒαž€αžΆαžšαž…αŸ†αžŽαžΆαž™ αžŸαž˜αžαž»αž›αŸ’αž™ αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž™αŸˆαž–αŸαž›αž˜αž½αž™αž†αŸ’αž“αžΆαŸ†αž€αž“αŸ’αž›αŸ‡ αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αžαŸ’αžšαžΉαž˜αžαŸ‚ 45 MB αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

αž”αŸ’αžšαž»αžŸ:

  • αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž› - αž’αŸ’αž“αž€αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž–αŸ’αžšαž½αž™αž”αžΆαžšαž˜αŸ’αž—αž’αŸ†αž–αžΈαžŸαŸ†αžŽαž½αžš αž€αžΆαžšαž•αŸ’αž‘αž»αž€αžαŸ’αž‡αž·αž› αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸ ORM αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžœαžαŸ’αžαž» C# αž’αž˜αŸ’αž˜αžαžΆαŸ”
  • αž˜αž·αž“αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž–αžΈαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž‘αŸαŸ”
  • αž›αžΏαž“αžŽαžΆαžŸαŸ‹ - αž‚αŸ’αž˜αžΆαž“αžŸαŸ†αžŽαžΎαž”αžŽαŸ’αžαžΆαž‰ αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αž€αžΌαžŠαž‘αŸ…αž‡αžΆαž—αžΆαžŸαžΆαžŸαŸ†αžŽαž½αžš αž˜αž·αž“αžαŸ’αžšαžΌαžœαž€αžΆαžš (de) αžŸαŸ€αžšαŸ€αž›αž“αŸƒαžœαžαŸ’αžαž»αŸ”
  • αžœαžΆβ€‹αž’αžΆαž…β€‹αž‘αž‘αž½αž›β€‹αž™αž€β€‹αž”αžΆαž“β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αžšαž€αŸ’αžŸαžΆβ€‹αž‘αž»αž€β€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™β€‹αž€αŸ’αž“αž»αž„β€‹αž‘αž˜αŸ’αžšαž„αŸ‹β€‹αžŽαžΆβ€‹αž˜αž½αž™ - αž˜αž·αž“β€‹αžαžΆβ€‹αž‡αžΆ XML αž“αŸ…β€‹αž›αžΎβ€‹αžαžΆαžŸ αž¬β€‹αž€αŸ’αž“αž»αž„ SQL Server αž¬β€‹αž€αŸ’αž“αž»αž„ Azure Table StorageαŸ”

αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·:

  • αž€αžΆαžšβ€‹αž’αŸ’αžœαžΎβ€‹αž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“β€‹αž•αŸ’αžŠαŸαž€β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αžΆαžαŸ‹αž”αž„αŸ‹ αž αžΎαž™β€‹αž‡αžΆβ€‹αž›αž‘αŸ’αž’αž•αž› αž€αžΆαžšβ€‹αžŠαžΆαž€αŸ‹β€‹αž–αž„αŸ’αžšαžΆαž™β€‹αž–αŸαž›β€‹αžœαŸαž›αžΆβ€‹αž˜αž·αž“β€‹αž’αžΆαž…β€‹αž’αŸ’αžœαžΎβ€‹αž”αžΆαž“β€‹αž‘αŸαŸ”
  • αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αžΆαŸ†αž„ αž’αŸ’αž“αž€αž’αžΆαž…αž”αžΆαžαŸ‹αž”αž„αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž½αž™αž•αŸ’αž“αŸ‚αž€αŸ” (αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αž˜αž·αž“αžŠαŸ‚αž›αž‚αžΆαŸ†αž„αž‘αŸαž˜αŸ‚αž“αž‘αŸ?)

αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž αžΎαž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€αŸ”
  • αž‚αŸ†αžšαžΌαžœαžαŸ’αžαž» αžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸαž”αž‹αž˜ αž“αž·αž„αžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ (1:1, 1:αž‡αžΆαž…αŸ’αžšαžΎαž“) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αŸ”
  • αž€αžΆαžšαž‡αžΆαžœαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αžœαžαŸ’αžαž» (INotifyPropertyChanged) αž“αž·αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž¬αžŠαž€αž…αŸαž‰αž’αžΆαžαž»αž‘αŸ…αž”αžŽαŸ’αžαž»αŸ† (INotifyCollectionChanged);
  • αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž‡αžΆαžœαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸαŸ‡ αžœαžαŸ’αžαž»αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž‡αž½αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαžšαžŸαŸαžšαž‘αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”
  • αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‡αžΆαž‘αŸ€αž„αž‘αžΆαžαŸ‹ (αž“αŸ…αž›αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αžœαŸαž›αžΆ) αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž›αžΆαž™αž•αŸ’αž‘αŸƒαžαžΆαž„αž€αŸ’αžšαŸ„αž™;
  • αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž…αŸαž‰αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αž•αž„αžŠαŸ‚αžšαŸ”

αž§αž‘αžΆαž αžšαžŽαŸαž€αžΌαžŠ

αž”αž“αŸ’αžαŸ‚αž˜αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž…αžΆαŸ†αž”αžΆαž…αŸ‹

// Основная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°
Install-Package OutCode.EscapeTeams.ObjectRepository
    
// Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ измСнСния
// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.
Install-Package OutCode.EscapeTeams.ObjectRepository.File
Install-Package OutCode.EscapeTeams.ObjectRepository.LiteDb
Install-Package OutCode.EscapeTeams.ObjectRepository.AzureTableStorage
    
// ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ - Ссли Π½ΡƒΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ модСль Π΄Π°Π½Π½Ρ‹Ρ… для Hangfire
// Install-Package OutCode.EscapeTeams.ObjectRepository.Hangfire

αž™αžΎαž„αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž‚αŸ†αžšαžΌαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€

public class ParentEntity : BaseEntity
{
    public ParentEntity(Guid id) => Id = id;
}
    
public class ChildEntity : BaseEntity
{
    public ChildEntity(Guid id) => Id = id;
    public Guid ParentId { get; set; }
    public string Value { get; set; }
}

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž‚αŸ†αžšαžΌαžœαžαŸ’αžαž»αŸ–

public class ParentModel : ModelBase
{
    public ParentModel(ParentEntity entity)
    {
        Entity = entity;
    }
    
    public ParentModel()
    {
        Entity = new ParentEntity(Guid.NewGuid());
    }
    
    public Guid? NullableId => null;
    
    // ΠŸΡ€ΠΈΠΌΠ΅Ρ€ связи 1:Many
    public IEnumerable<ChildModel> Children => Multiple<ChildModel>(x => x.ParentId);
    
    protected override BaseEntity Entity { get; }
}
    
public class ChildModel : ModelBase
{
    private ChildEntity _childEntity;
    
    public ChildModel(ChildEntity entity)
    {
        _childEntity = entity;
    }
    
    public ChildModel() 
    {
        _childEntity = new ChildEntity(Guid.NewGuid());
    }
    
    public Guid ParentId
    {
        get => _childEntity.ParentId;
        set => UpdateProperty(() => _childEntity.ParentId, value);
    }
    
    public string Value
    {
        get => _childEntity.Value;
        set => UpdateProperty(() => _childEntity.Value, value
    }
    
    // Доступ с поиском ΠΏΠΎ индСксу
    public ParentModel Parent => Single<ParentModel>(ParentId);
    
    protected override BaseEntity Entity => _childEntity;
}

αž αžΎαž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αžαŸ’αž“αžΆαž€αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžαŸ’αž›αž½αž“αžœαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ–

public class MyObjectRepository : ObjectRepositoryBase
{
    public MyObjectRepository(IStorage storage) : base(storage, NullLogger.Instance)
    {
        IsReadOnly = true; // Для тСстов, позволяСт Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ измСнСния Π² Π±Π°Π·Ρƒ
    
        AddType((ParentEntity x) => new ParentModel(x));
        AddType((ChildEntity x) => new ChildModel(x));
    
        // Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Hangfire ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ модСль Π΄Π°Π½Π½Ρ‹Ρ… для Hangfire Π² ObjectRepository
        // this.RegisterHangfireScheme(); 
    
        Initialize();
    }
}

αž”αž„αŸ’αž€αžΎαž ObjectRepository αž§αž‘αžΆαž αžšαžŽαŸαŸ–

var memory = new MemoryStream();
var db = new LiteDatabase(memory);
var dbStorage = new LiteDbStorage(db);
    
var repository = new MyObjectRepository(dbStorage);
await repository.WaitForInitialize();

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‚αž˜αŸ’αžšαŸ„αž„αž“αžΉαž„αž”αŸ’αžšαžΎ HangFire

public void ConfigureServices(IServiceCollection services, ObjectRepository objectRepository)
{
    services.AddHangfire(s => s.UseHangfireStorage(objectRepository));
}

αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αžœαžαŸ’αžαž»αžαŸ’αž˜αžΈαŸ–

var newParent = new ParentModel()
repository.Add(newParent);

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž αŸ…αž“αŸαŸ‡αžœαžαŸ’αžαž» αž˜αŸ‰αžΌαžŠαŸ‚αž› Parent αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž‘αžΆαŸ†αž„αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž“αž·αž„αž‡αž½αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαžšαžŸαŸαžšαž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž€αžΆαžš O(1) αž αžΎαž™αžœαžαŸ’αžαž»αž“αŸαŸ‡αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αž—αŸ’αž›αžΆαž˜αŸ—αŸ”

αž§αž‘αžΆαž αžšαžŽαŸ αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αžšαž€αžœαžαŸ’αžαž»αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ αž αžΎαž™αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžαžΆαžœαžαŸ’αžαž»αžŠαŸ‚αž›αž”αžΆαž“αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž‚αžΊαž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ–

var parents = repository.Set<ParentModel>();
var myParent = parents.Find(newParent.Id);
Assert.IsTrue(ReferenceEquals(myParent, newParent));

αž˜αžΆαž“β€‹αž’αŸ’αžœαžΈβ€‹αž€αžΎαžαž‘αžΎαž„? αž€αŸ†αžŽαžαŸ‹ () αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰ αžœαž…αž“αžΆαž“αž»αž€αŸ’αžšαž˜αžαžΆαžšαžΆαž„, αžŠαŸ‚αž›αž˜αžΆαž“ αžœαž…αž“αžΆαž“αž»αž€αŸ’αžšαž˜αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαŸ” αž“αž·αž„αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž˜αž»αžαž„αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž“αŸƒαž›αž·αž”αž·αž€αŸ’αžšαž˜αž”αž‹αž˜ αž“αž·αž„αž’αž“αž»αžœαž·αž‘αŸ’αž™αžΆαž›αŸαž™αŸ” αžœαžΆαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž˜αžΆαž“αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αžŠαŸ„αž™ Id (αž¬αž›αž·αž”αž·αž€αŸ’αžšαž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αŸ†αž–αžΆαž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αž) αžŠαŸ„αž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž’αŸ’αžœαžΎαž˜αŸ’αžαž„αž‘αŸ€αžαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αž›αžΎαžœαžαŸ’αžαž»αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αž“αŸ…αž–αŸαž›αž”αž“αŸ’αžαŸ‚αž˜αžœαžαŸ’αžαž»αž‘αŸ… ObjectRepository αž€αžΆαžšαž‡αžΆαžœαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŽαžΆαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž€αŸαž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αžœαžαŸ’αžαž»αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž‡αž½αžšαžŸαžšαžŸαŸαžšαž•αž„αžŠαŸ‚αžšαŸ” 
αž€αžΆαžšαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž–αžΈαžαžΆαž„αž€αŸ’αžšαŸ…αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αžΉαž„αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžœαžαŸ’αžαž» POCOαŸ–

myParent.Children.First().Property = "Updated value";

αž’αŸ’αž“αž€αž’αžΆαž…αž›αž»αž”αžœαžαŸ’αžαž»αžαžΆαž˜αžœαž·αž’αžΈαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

repository.Remove(myParent);
repository.RemoveRange(otherParents);
repository.Remove<ParentModel>(x => !x.Children.Any());

αž“αŸαŸ‡αž€αŸαž”αž“αŸ’αžαŸ‚αž˜αžœαžαŸ’αžαž»αž‘αŸ…αž‡αž½αžšαž›αž»αž”αŸ”

αžαžΎαž€αžΆαžšαžŸαž“αŸ’αžŸαŸ†αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

ObjectRepository αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžαŸ’αžαž»αžŠαŸ‚αž›αž”αžΆαž“αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš (αž‘αžΆαŸ†αž„αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜ αž¬αž€αžΆαžšαž›αž»αž” αž¬αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž›αž€αŸ’αžαžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·) αž”αž„αŸ’αž€αžΎαžαž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž˜αž½αž™αŸ” αž˜αŸ‰αžΌαžŠαŸ‚αž›αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžΆαž“αž‡αžΆαžœ αž€αžΆαžšαž•αŸ’αž‘αž»αž€. αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αž€αžΆαžšαž•αŸ’αž‘αž»αž€ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž€αžΎαžαž‘αžΎαž„ αž˜αŸ‰αžΌαžŠαŸ‚αž›αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž‡αžΆ 3 αž‡αž½αžš - αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž“αŸ’αžαŸ‚αž˜ αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž– αž“αž·αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž›αž»αž”αŸ”

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž•αž„αžŠαŸ‚αžšαŸ” αž€αžΆαžšαž•αŸ’αž‘αž»αž€ αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž–αž½αž€αž‚αŸαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αžŠαŸ‚αž›αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžšαŸ€αž„αžšαžΆαž›αŸ‹ 5 αžœαž·αž“αžΆαž‘αžΈαŸ” 

αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αž αž˜αžΆαž“ API αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αžαŸ†αž±αŸ’αž™αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αŸ– ObjectRepository.Save().

αž˜αž»αž“αž–αŸαž›αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αžΈαž˜αž½αž™αŸ— αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž‚αŸ’αž˜αžΆαž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαž€αž…αŸαž‰αž–αžΈαž‡αž½αžšαžŠαŸ†αž”αžΌαž„ (αž§αž‘αžΆαž αžšαžŽαŸ αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαžŸαŸ’αž‘αž½αž“ - αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžαŸ’αžαž»αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž–αžΈαžšαžŠαž„ αž¬αž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜/αž™αž€αž…αŸαž‰αžœαžαŸ’αžαž»αž—αŸ’αž›αžΆαž˜αŸ—) αž αžΎαž™αž˜αžΆαž“αžαŸ‚αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžαŸ’αž›αž½αž“αž―αž„αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” 

αž€αŸ’αž“αž»αž„αž‚αŸ’αžšαž”αŸ‹αž€αžšαžŽαžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αžœαžαŸ’αžαž»αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž‘αžΆαŸ†αž„αž˜αžΌαž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž…αžŠαŸ‚αž›αžαžΆαžœαžαŸ’αžαž»αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αž›αŸ†αžŠαžΆαž”αŸ‹αž•αŸ’αžŸαŸαž„αž‡αžΆαž„αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž“αŸƒαžœαžαŸ’αžαž»αž‡αžΆαž„αž–αŸαž›αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž‡αž½αžšαŸ”

αžαžΎβ€‹αž˜αžΆαž“β€‹αž’αŸ’αžœαžΈβ€‹αž•αŸ’αžŸαŸαž„αž‘αŸ€αžβ€‹αž“αŸ…β€‹αž‘αžΈαž“αŸ„αŸ‡?

  • αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαž•αŸ’αž’αŸ‚αž€αž›αžΎ .NET Standard 2.0 αŸ” αž’αžΆαž…αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„ .NET αž‘αŸ†αž“αžΎαž”αžŽαžΆαž˜αž½αž™αŸ”
  • API αž˜αžΆαž“αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ” αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αž‘αŸƒαž€αŸ’αž“αž»αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎ αžœαž…αž“αžΆαž“αž»αž€αŸ’αžšαž˜αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαŸ”αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž˜αžΆαž“αžŸαŸ„ αž¬αž˜αž·αž“αžαŸ’αžšαžΌαžœαž€αžΆαžšαžœαžΆαŸ” 
    αžšαžΏαž„αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžŠαŸ‚αž›αž‚αž½αžšαž…αž„αž…αžΆαŸ†αž‚αžΊαž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘ ObjectRepository.Save();
  • αž›αž·αž”αž·αž€αŸ’αžšαž˜αž”αŸ†αž–αžΆαž“ (αž‘αžΆαž˜αž‘αžΆαžšαž—αžΆαž–αž”αŸ’αž›αŸ‚αž€αž–αžΈαž‚αŸ)αŸ–

repository.Set<ChildModel>().AddIndex(x => x.Value);
repository.Set<ChildModel>().Find(x => x.Value, "myValue");

αžαžΎαž’αŸ’αž“αž€αžŽαžΆαž”αŸ’αžšαžΎαžœαžΆ?

αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αž…αŸ†αžŽαž„αŸ‹αž…αŸ†αžŽαžΌαž›αž…αž·αžαŸ’αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž˜αžΆαž“αž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž˜αž·αž“αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαžšαžŸαŸαžšαžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž…αžΌαž›αž”αŸ’αžšαžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™ αž¬αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž’αŸ’αž„αž“αŸ‹αŸ” αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αŸ’αž“αž»αž„ litedb αž¬αž―αž€αžŸαžΆαžšαž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αŸ” 

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαž›αž–αžΈαž˜αž»αž“ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž› EscapeTeams αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž₯αž‘αžΌαžœαž“αŸαŸ‡ (αžαŸ’αž‰αž»αŸ†β€‹αž‚αž·αžβ€‹αžαžΆβ€‹αž“αŸ…β€‹αž‘αžΈβ€‹αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž›αž»αž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž’αžαŸ‹β€‹αž˜αžΆαž“β€‹αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸβ€‹αž˜αŸ’αžŠαž„β€‹αž‘αŸ€αžαŸ”) - αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Azure Table Storage αŸ”

αž•αŸ‚αž“αž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αž“αžΆαž‚αž

αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž‡αž½αžŸαž‡αž»αž›αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž…αž˜αŸ’αž”αž„αž˜αž½αž™αž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡ - αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž•αŸ’αžŠαŸαž€αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™ (sic!) αž¬αž’αŸ’αžœαžΎαž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžŠαŸ„αž™αž†αž“αŸ’αž‘αŸˆαžŠαŸαž˜αž»αžαž˜αžΆαŸ†αžαžΆαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΌαž…αž‚αŸ’αž“αžΆαž–αžΈαž€αžšαžŽαžΈαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαž˜αž·αž“αž‚αž½αžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž¬αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž–αž½αž€αž‚αŸαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαžΆαž˜αž‚αŸ„αž›αž€αžΆαžšαžŽαŸ "αž’αŸ’αž“αž€αžŽαžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž‚αžΊαžαŸ’αžšαžΌαžœ"αŸ”

αžαžΆαž˜αž‘αžŸαŸ’αžŸαž“αŸˆαž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸ αžαŸ’αž‰αž»αŸ†αžƒαžΎαž‰αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αŸ–

  • αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ EventLog αž“αž·αž„ Snapshot αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž‚αŸ†αžšαžΌαžœαžαŸ’αžαž»
  • αžŸαŸ’αžœαŸ‚αž„αžšαž€αžœαžαŸ’αžαž»αž•αŸ’αžŸαŸαž„αž‘αŸ€αž (αž”αž“αŸ’αžαŸ‚αž˜αž…αŸ†αžŽαž»αž…αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαžœαžαŸ’αžαž»αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‘αŸ…αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹? udp discovery? master/slave?)
  • αž…αž˜αŸ’αž›αž„αžšαžœαžΆαž„αž’αžΆαžαž» EventLog αžαžΆαž˜αžšαž™αŸˆαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž―αž€αž—αžΆαž–αžŽαžΆαž˜αž½αž™ αžŠαžΌαž…αž‡αžΆ RAFT αž‡αžΆαžŠαžΎαž˜αŸ”

αžœαžΆαž€αŸαž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž˜αž½αž™αž‘αŸ€αžαžŠαŸ‚αž›αž’αŸ’αžœαžΎαž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž–αŸ’αžšαž½αž™αž”αžΆαžšαž˜αŸ’αž—αž•αž„αžŠαŸ‚αžš - αž€αžΆαžšαž›αž»αž”αž›αŸ’αž”αžΆαž€αŸ‹ αž¬αž€αžΆαžšαžšαž€αžƒαžΎαž‰αž€αžšαžŽαžΈαž“αŸƒαž€αžΆαžšαž›αž»αž”αžœαžαŸ’αžαž»αžŠαŸ‚αž›αž˜αžΆαž“αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž–αžΈαžœαžαŸ’αžαž»αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” 

αž”αŸ’αžšαž—αž–

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αž’αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž‘αžΈαž“αŸαŸ‡ αž“αŸ„αŸ‡αž’αŸ’αžœαžΈαŸ—αžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž‚αžΊαžαŸ’αžšαžΌαžœαž’αžΆαž“αž€αžΌαžŠ αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž›αžΎ GitHubαŸ–
https://github.com/DiverOfDark/ObjectRepository

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹