α ααα»α’αααΈααααΌααα»ααα·ααααααααΆααα’αααααα»αα’αααα αα αΆα?
ααΎααααΈαααααΆαα»αααα ααααα α¬αα·αααααααααααααΆαααααα ααααααααΆααααΆααααΌαααααααα»ααααααααΆαααααΆααααΆααΆαα αααΎαααΊααααΎαααΎαααΌαααααΆααα·αααααα SQL α
ααα»αααααααααααααΆααα·ααααααα»αα α·αααααΆααααΌαα·αααααααα·ααααααααααααΆαα SQL ααα α§ααΆα ααα αα ααααααααΎαααΆαααααααα α¬ααααΆα ααααααα α’αααααααΌααααααααααααΆαααααααααα»αααααααΆααααΆαααααα»α
ααααΆαααΆαααα’αΆααααααααα»αααΊαα ααααααα’αααααααΎααΆαααΆαααα»α α αΎααα·ααααα½αααΆαααΆααα·αααΉαααΈαααααααααΎααααα½ααα ααα ααΎα’αααα αααΆααααααα»ααααΆααααα»αααΆααααααααΆααααα αΆ N+1 αα·ααααααΎααα·αα·ααααααααααααΎααααΈα±αα SELECT αα ααΎαααααααααΉααααα αααααα»αααα·ααΆαααα ααα»αα?
αα·ααΈααΆαααααααααααα·αααα½ααααααΊ NoSQL α ααα»ααααΆαααααΆααα»αααΆαααΆααααααΆααααααΎαααΆα αααΎααα»ααα·ααααααΆαααααα - αααααΆααα±ααΆαααΆααααα½αααΆαα½αααααα½αααααΆαααΆαααααααΆα MongoDB α αΎαααΈαααΆαααΆαα½αααΉαα ααααΎααααα»αααααααααΆα―αααΆα json (ααααα·ααΈααα ααΎα’αααααααΌαααΆααααΎα ααααα ααα½αααα»ααααΆα αααααΆααααααααΆαααααααααα αααα»αα―αααΆα?).
αααα»αααααΎα±ααααΆααααααα·ααΈααΆααααααααα½ααα½ααααααααα - α ααα»α’αααΈαα·αααααΆααΆααααααΆαα»ααα·ααααααααΆααα’αααα αααα»αα’αααα αα αΆααααααα·ααΈ ααααααααΆαα»αααΆααΆαααααΆαααα αααααααααα»αα ααααα (α―αααΆα ααΌαααααΆααα·ααααααααΈα ααααΆα)?
α’αααα
αα
αΆαααΆαααααΆααα
ααΆααα α αΎααα·αααααααααα’αΆα
ααααΎαα
ααΆααααααΆααααααααααααΆαααΌα
αα·ααααααααΆαα
αααΎαααΉαααααΉαα’αααα
αα
αΆα 1 GB α (α§ααΆα ααα ααααααααααααααααα»αα
αΌαα
α·αααααΊ
αααα»α:
- ααΆαα αΌαααααΎαα·ααααααααΆααααααΆααααα½α - α’ααααα·αα αΆαααΆα ααααα½αααΆααααα’αααΈαααα½α ααΆααααα»ααααα·α αααααααα·ααα 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α
ααααα: www.habr.com