แ แแขแแ แแแแฎแแแ แงแแแแ แแแแแชแแแ แแแฎแกแแแ แแแแจแ?
แแแแกแแแขแแก แแ แกแแ แแแแ แแ แแแแแชแแแแแแก แจแแกแแแแฎแแ, แแแแแแ แ แแแแแแแแแแแก แฃแแแขแแกแแแแก แแแ แแแแ แกแฃแ แแแแ แแฅแแแแ SQL แแแแแชแแแแ แแแแแก แแ แฉแแแ.
แแแแ แแ แแแแฏแแ แแแแแแแ แแแ แ, แ แแ แแแแแชแแแแ แแแแแแ แแ แแ แแก แจแแกแแคแแ แแกแ SQL-แกแแแแก: แแแแแแแแแ, แกแแซแแแแ แแ แกแแชแแแแฃแ แ แแ แแคแแก แจแแฅแแแแกแแก, แแฅแแแ แฃแแแ แแแซแแแแแ แ แแฃแแ แฃแ แแแแ แแแแแแ แแแแแฅแขแแแก แจแแ แแก.
แงแแแแแแ แชแฃแแ แกแแขแฃแแชแแแ, แ แแชแ แแฃแแแจแ แแฃแจแแแ แแ แแแแแแแ แแ แแชแแก แ แแแแ แจแแฅแแแแก แกแฌแ แแคแ แแแแฎแแแแแแ. แ แแแแแแ แแ แ แแแฎแแ แฏแแ N+1 แแแแชแแแแแแก แแแแแญแ แแกแ แแ แแแแแขแแแแแ แแแแแฅแกแแแแก แจแแฅแแแแแ, แ แแแ แแแแแแ แแแแ แแแ SELECT แจแแกแ แฃแแแแก แแแแแแ แฃแ แแ แแจแ?
แแแแแ แแ แแ แแแแฃแแแ แฃแแ แแแแแแแ แแ แแก NoSQL. แ แแแแแแแแ แฌแแแก แฌแแ แแงแ แแแแ แ แแแแแขแแแ แแ แแแแแก แแ แแแแแ - แแแแแกแแแแ แ แแแกแแฎแแ แฎแแแแแ แจแแแแฎแแแแแกแแแแก แแแ แแแแแแแแกแแก MongoDB แแ แแแแงแแคแแแ แแงแแแแ แแแกแฃแฎแแแแ json แแแแฃแแแแขแแแแก แกแแฎแแ (แกแฎแแแแ แจแแ แแก, แ แแแแแแ แฎแแแฏแแฎแแแแก แฉแแกแแ แแแแแฌแแแ แแแแฃแแแแขแแแจแ แฌแ แแฃแแ แแแฃแแแแแก แแแแ?).
แแ แแแแแแแแแ แกแชแแแแ แกแฎแแ, แแแขแแ แแแขแแฃแแ แแแแแแ - แ แแขแแ แแ แกแชแแแแ แงแแแแ แแแแแชแแแแก แจแแแแฎแแ แแแแแแแชแแแก แแแฎแกแแแ แแแแจแ, แแแ แแแแฃแแแ แจแแแแฎแแ แจแแแแฎแแแแแ แกแแชแแแจแ (แคแแแแ, แแแกแขแแแชแแฃแ แ แแแแแชแแแแ แแแแ)?
แแแฎแกแแแ แแแ แแแคแ แแแฎแแ แแ แแชแแ แ แแ แกแแจแฃแแแ แแแแแก แแ แแแฅแขแแแแก แฃแแแขแแกแแแแกแแแแก แแแแแกแแแแ แ แจแแกแแซแแ แแแแแชแแแ แฏแแแแ 1 แแ แแแฎแกแแแ แแแแจแ. (แแแแแแแแแ, แฉแแแ แกแแงแแแ แแแ แกแแฎแแแก แแ แแแฅแขแแ
แแแแแแแแ:
- แแแแแชแแแแแแ แฌแแแแแ แฃแคแ แ แแแแแแ แฎแแแแ - แแฅแแแ แแ แแญแแ แแแแแ แคแแฅแ แ แจแแแแแฎแแแแแ, แแแ แแแชแ แแแขแแแ แแแแแ, ORM แคแฃแแฅแชแแแแแ, แแฅแแแ แแฃแจแแแแ แฉแแแฃแแแแ แแ C# แแแแแฅแขแแแแแ;
- แแ แแ แกแแแแแก แแ แแแแแแแแ แกแฎแแแแแกแฎแแ แแแแแแแแแ แฌแแแแแแกแแแ;
- แซแแแแแ แกแฌแ แแคแ - แแ แแ แแก แฅแกแแแแก แแแแฎแแแแ, แแ แแ แแก แแแแแก แแแ แแแแ แจแแแแแฎแแแก แแแแแ, แแ แแ แแก แกแแญแแ แ แแแแแฅแขแแแแก (แแ)แกแแ แแแแแแแชแแ;
- แแแกแแจแแแแแ แแแแแชแแแแแแก แจแแแแฎแแ แแแแแกแแแแ แ แคแแ แแแ - แแฅแแแแ แแก XML แแแกแแแ, แแฃ SQL Server-แจแ, แแฃ Azure Table Storage-แจแ.
Cons:
- แฐแแ แแแแแขแแแฃแ แ แแแกแจแขแแแแ แแแ แแแแแ แแฃแแแ แแ แจแแแแแแ, แแฃแแแแแแ แจแแคแแ แฎแแแแก แแแแแแแแแ แจแแฃแซแแแแแแแ;
- แแฃ แแแแแแแชแแ แแแแ แแฃแแแ, แจแแแซแแแแ แแแฌแแแแแ แแ แแแแแ แแแ แแแแแชแแแแแ. (แแแแ แแ แฉแแแแ แแแแแแแชแแ แแ แแกแแ แแก แแจแแแแ, แแ แ?)
แ แแแแ แแฃแจแแแแก แแแ?
แแแแแ แแแแ แจแแแแแแแ:
- แแแกแแฌแงแแกแจแ แแงแแ แแแแ แแแแจแแ แ แแแแแชแแแแ แกแแชแแแแแ แแ แแขแแแ แแแแ แแแแแชแแแแแ;
- แแแแแฃแแแ แแแแแฅแขแแก แแแแแแ, แแแ แแแแแแ แแแแแฅแกแแแ แแ แ แแแแชแแฃแ แ แแแแแฅแกแแแ (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);
แแ แแแฌแแแแแแ แแแแแฅแขแ แแจแแแแแก แแแแแแ แแแแขแแแ แ แแแแ แช แแแแแแฃแ แฅแแจแก, แแกแแแ แแแแแชแแแแ แแแแแจแ แฉแแกแแฌแแ แ แแแก. แแแแขแแ, แแก แแแแ แแชแแ แแฆแแแก 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 แกแขแแแแแ แข 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 แแฆแแแฉแแแ? master/slave?)
- แแแแแแแ แแ EventLog แแแกแขแแแชแแแแก แจแแ แแก แแแแแกแแแแ แ แแแแกแแแกแฃแกแแก แแแแแ แแแแแก แกแแจแฃแแแแแแ, แ แแแแ แแชแแ RAFT.
แแกแแแ แแ แแก แแแแแ แแ แแ แแ แแแแแแ, แ แแแแแแช แแแฌแฃแฎแแแก - แแแกแแแแแก แฌแแจแแ, แแแฃ แแ แแแแแฅแขแแแแก แฌแแจแแแก แจแแแแฎแแแแแแแก แแแแแแแแแ, แ แแแแแแกแแช แแฅแแ แแแฃแแ แกแฎแแ แแแแแฅแขแแแแแแ.
แแแแแก แแแแ
แแฃ แแฅแแแแ แฌแแแแแแฎแแ, แแแจแแ แ แฉแแแ แแฎแแแแ แแแแแก แฌแแแแแฎแแ; แแก แจแแแแซแแแแ แแแฎแแ GitHub-แแ:
แฌแงแแ แ: www.habr.com