ObjectRepository - ื“ืคื•ืก ืžืื’ืจ .NET ื‘ื–ื™ื›ืจื•ืŸ ืขื‘ื•ืจ ื”ืคืจื•ื™ืงื˜ื™ื ื”ื‘ื™ืชื™ื™ื ืฉืœืš

ืœืžื” ืœืื—ืกืŸ ืืช ื›ืœ ื”ื ืชื•ื ื™ื ื‘ื–ื™ื›ืจื•ืŸ?

ื›ื“ื™ ืœืื—ืกืŸ ื ืชื•ื ื™ ืืชืจ ืื• backend, ื”ืจืฆื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœ ืจื•ื‘ ื”ืื ืฉื™ื ื”ืฉืคื•ื™ื™ื ื™ื”ื™ื” ืœื‘ื—ื•ืจ ื‘ืžืกื“ ื ืชื•ื ื™ื ืฉืœ SQL. 

ืื‘ืœ ืœืคืขืžื™ื ืขื•ืœื” ื‘ืจืืฉ ื”ืžื—ืฉื‘ื” ืฉืžื•ื“ืœ ื”ื ืชื•ื ื™ื ืœื ืžืชืื™ื ืœ-SQL: ืœืžืฉืœ, ื›ืฉื‘ื•ื ื™ื ื—ื™ืคื•ืฉ ืื• ื’ืจืฃ ื—ื‘ืจืชื™, ืฆืจื™ืš ืœื—ืคืฉ ืงืฉืจื™ื ืžื•ืจื›ื‘ื™ื ื‘ื™ืŸ ืื•ื‘ื™ื™ืงื˜ื™ื. 

ื”ืžืฆื‘ ื”ื’ืจื•ืข ื‘ื™ื•ืชืจ ื”ื•ื ื›ืฉืืชื” ืขื•ื‘ื“ ื‘ืฆื•ื•ืช ื•ืขืžื™ืช ืœื ื™ื•ื“ืข ืœื‘ื ื•ืช ืฉืื™ืœืชื•ืช ืžื”ื™ืจื•ืช. ื›ืžื” ื–ืžืŸ ื”ืฉืงืขืช ื‘ืคืชืจื•ืŸ ื‘ืขื™ื•ืช N+1 ื•ื‘ื ื™ื™ืช ืื™ื ื“ืงืกื™ื ื ื•ืกืคื™ื ื›ื“ื™ ืฉื”-SELECT ื‘ืขืžื•ื“ ื”ืจืืฉื™ ื™ืกืชื™ื™ื ื‘ืคืจืง ื–ืžืŸ ืกื‘ื™ืจ?

ื’ื™ืฉื” ืคื•ืคื•ืœืจื™ืช ื ื•ืกืคืช ื”ื™ื NoSQL. ืœืคื ื™ ืžืกืคืจ ืฉื ื™ื ื”ื™ื” ื”ืจื‘ื” ื”ื™ื™ืค ืกื‘ื™ื‘ ื”ื ื•ืฉื ื”ื–ื” - ืœื›ืœ ืื™ืจื•ืข ื ื•ื— ื”ื ืคืจืกื• MongoDB ื•ืฉืžื—ื• ืžื”ืชืฉื•ื‘ื•ืช ื‘ืฆื•ืจืช ืžืกืžื›ื™ json (ืื’ื‘, ื›ืžื” ืงื‘ื™ื™ื ื”ื™ื™ืช ืฆืจื™ืš ืœื”ื›ื ื™ืก ื‘ื’ืœืœ ื”ืงื™ืฉื•ืจื™ื ื”ืžืขื’ืœื™ื™ื ื‘ืžืกืžื›ื™ื?).

ืื ื™ ืžืฆื™ืข ืœื ืกื•ืช ืฉื™ื˜ื” ื—ืœื•ืคื™ืช ืื—ืจืช - ืœืžื” ืœื ืœื ืกื•ืช ืœืื—ืกืŸ ืืช ื›ืœ ื”ื ืชื•ื ื™ื ื‘ื–ื™ื›ืจื•ืŸ ื”ืืคืœื™ืงืฆื™ื”, ืœืฉืžื•ืจ ืื•ืชื ืžืขืช ืœืขืช ืœืื—ืกื•ืŸ ืืงืจืื™ (ืงื•ื‘ืฅ, ืžืกื“ ื ืชื•ื ื™ื ืžืจื•ื—ืง)? 

ื”ื–ื™ื›ืจื•ืŸ ื”ืคืš ืœื–ื•ืœ, ื•ื›ืœ ื ืชื•ื ื™ื ืืคืฉืจื™ื™ื ืขื‘ื•ืจ ืจื•ื‘ ื”ืคืจื•ื™ืงื˜ื™ื ื”ืงื˜ื ื™ื ื•ื”ื‘ื™ื ื•ื ื™ื™ื ื™ื›ื ืกื• ืœื–ื™ื›ืจื•ืŸ ืฉืœ 1 GB. (ืœื“ื•ื’ืžื”, ื”ืคืจื•ื™ืงื˜ ื”ื‘ื™ืชื™ ื”ืื”ื•ื‘ ืขืœื™ื™ ื”ื•ื ืขื•ืงื‘ ืคื™ื ื ืกื™, ื”ืฉื•ืžืจืช ืกื˜ื˜ื™ืกื˜ื™ืงื” ื™ื•ืžื™ืช ื•ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื”ื”ื•ืฆืื•ืช, ื”ื™ืชืจื•ืช ื•ื”ืขืกืงืื•ืช ืฉืœื™ ื‘ืžืฉืš ืฉื ื” ื•ื—ืฆื™, ืฆื•ืจื›ืช ืจืง 45 ืžื’ื”-ื‘ื™ื™ื˜ ืฉืœ ื–ื™ื›ืจื•ืŸ.)

ื™ืชืจื•ื ื•ืช:

  • ื”ื’ื™ืฉื” ืœื ืชื•ื ื™ื ื”ื•ืคื›ืช ืงืœื” ื™ื•ืชืจ - ืื™ื ืš ืฆืจื™ืš ืœื“ืื•ื’ ืœื’ื‘ื™ ืฉืื™ืœืชื•ืช, ื˜ืขื™ื ื” ืขืฆืœื ื™ืช, ืชื›ื•ื ื•ืช ORM, ืืชื” ืขื•ื‘ื“ ืขื ืื•ื‘ื™ื™ืงื˜ื™ C# ืจื’ื™ืœื™ื;
  • ืื™ืŸ ื‘ืขื™ื•ืช ื”ืงืฉื•ืจื•ืช ืœื’ื™ืฉื” ืžืฉืจืฉื•ืจื™ื ืฉื•ื ื™ื;
  • ืžื”ื™ืจ ืžืื•ื“ - ืื™ืŸ ื‘ืงืฉื•ืช ืจืฉืช, ืื™ืŸ ืชืจื’ื•ื ืงื•ื“ ืœืฉืคืช ืฉืื™ืœืชื”, ืื™ืŸ ืฆื•ืจืš ื‘(ื“ื”)ืกืจื™ืืœื™ื–ืฆื™ื” ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื;
  • ืžืงื•ื‘ืœ ืœืื—ืกืŸ ื ืชื•ื ื™ื ื‘ื›ืœ ืฆื•ืจื” - ื‘ื™ืŸ ืื ื–ื” ื‘-XML ื‘ื“ื™ืกืง, ืื• ื‘-SQL Server, ืื• ื‘-Azure Table Storage.

ื—ืกืจื•ื ื•ืช:

  • ืฉื™ื ื•ื™ ืงื ื” ืžื™ื“ื” ืื•ืคืงื™ ืื•ื‘ื“, ื•ื›ืชื•ืฆืื” ืžื›ืš, ืœื ื ื™ืชืŸ ืœื‘ืฆืข ืคืจื™ืกืช ื–ืžืŸ ื”ืฉื‘ืชื” ืืคืก;
  • ืื ื”ืืคืœื™ืงืฆื™ื” ืงื•ืจืกืช, ืืชื” ืขืœื•ืœ ืœืื‘ื“ ื ืชื•ื ื™ื ื—ืœืงื™ืช. (ืื‘ืœ ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• ืืฃ ืคืขื ืœื ืงื•ืจืกืช, ื ื›ื•ืŸ?)

ืื™ืš ื–ื” ืขื•ื‘ื“?

ื”ืืœื’ื•ืจื™ืชื ื”ื•ื ื›ื“ืœืงืžืŸ:

  • ื‘ื”ืชื—ืœื” ื ื•ืฆืจ ื—ื™ื‘ื•ืจ ืขื ืื—ืกื•ืŸ ื”ื ืชื•ื ื™ื ื•ื”ื ืชื•ื ื™ื ื ื˜ืขื ื™ื;
  • ื‘ื ื•ื™ื™ื ืžื•ื“ืœ ืื•ื‘ื™ื™ืงื˜, ืื™ื ื“ืงืกื™ื ืจืืฉื™ื™ื ื•ืื™ื ื“ืงืกื™ื ื™ื—ืกื™ื™ื (1:1, 1:Many);
  • ื ื•ืฆืจ ืžื ื•ื™ ืœืฉื™ื ื•ื™ื™ื ื‘ืžืืคื™ื™ื ื™ ื”ืื•ื‘ื™ื™ืงื˜ (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 (ืื• ืื™ื ื“ืงืกื™ื ืฉืจื™ืจื•ืชื™ื™ื ืื—ืจื™ื ืฉืœ ืžืฉืชืžืฉื™ื) ืžื‘ืœื™ ืœื‘ืฆืข ืื™ื˜ืจืฆื™ื” ืžืœืื” ืขืœ ื›ืœ ื”ืื•ื‘ื™ื™ืงื˜ื™ื.

ื‘ืขืช ื”ื•ืกืคืช ืื•ื‘ื™ื™ืงื˜ื™ื ืœ ืžืื’ืจ ืื•ื‘ื™ื™ืงื˜ื™ื ืžืชื•ื•ืกืฃ ืžื ื•ื™ ื›ื“ื™ ืœืฉื ื•ืช ืืช ื”ืžืืคื™ื™ื ื™ื ืฉืœื”ื, ื›ืš ืฉื›ืœ ืฉื™ื ื•ื™ ื‘ืžืืคื™ื™ื ื™ื ื’ื•ืจื ื’ื ืœื”ื•ืกืคืช ืื•ื‘ื™ื™ืงื˜ ื–ื” ืœืชื•ืจ ื”ื›ืชื™ื‘ื”. 
ืขื“ื›ื•ืŸ ืžืืคื™ื™ื ื™ื ืžื‘ื—ื•ืฅ ื ืจืื” ื›ืžื• ืขื‘ื•ื“ื” ืขื ืื•ื‘ื™ื™ืงื˜ POCO:

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

ื ื™ืชืŸ ืœืžื—ื•ืง ืื•ื‘ื™ื™ืงื˜ ื‘ื“ืจื›ื™ื ื”ื‘ืื•ืช:

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

ื–ื” ื’ื ืžื•ืกื™ืฃ ืืช ื”ืื•ื‘ื™ื™ืงื˜ ืœืชื•ืจ ื”ืžื—ื™ืงื”.

ืื™ืš ืขื•ื‘ื“ ื”ื—ื™ืกื›ื•ืŸ?

ืžืื’ืจ ืื•ื‘ื™ื™ืงื˜ื™ื ื›ืืฉืจ ืื•ื‘ื™ื™ืงื˜ื™ื ืžื ื•ื˜ืจื™ื ืžืฉืชื ื™ื (ืื• ื”ื•ืกืคื” ืื• ืžื—ื™ืงื”, ืื• ืฉื™ื ื•ื™ ืžืืคื™ื™ื ื™ื), ืžืขืœื” ืื™ืจื•ืข ื”ื“ื’ื ื”ืฉืชื ื”ืจืฉื•ื ืœ ืื—ืกื•ืŸ. ื™ื™ืฉื•ืžื™ื ืื—ืกื•ืŸ ื›ืืฉืจ ืžืชืจื—ืฉ ืื™ืจื•ืข ื”ื“ื’ื ื”ืฉืชื ื” ืฉื™ื ื•ื™ื™ื ืžื•ื›ื ืกื™ื ืœ-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? ืžืืกื˜ืจ/ืขื‘ื“?)
  • ืฉื›ืคื•ืœ ื‘ื™ืŸ ืžื•ืคืขื™ EventLog ื‘ืืžืฆืขื•ืช ื›ืœ ืืœื’ื•ืจื™ืชื ืงื•ื ืฆื ื–ื•ืก, ื›ื’ื•ืŸ RAFT.

ื™ืฉื ื” ื’ื ื‘ืขื™ื” ื ื•ืกืคืช ืฉืžื“ืื™ื’ื” ืื•ืชื™ - ืžื—ื™ืงืช ืžื“ื•ืจื’ืช, ืื• ื–ื™ื”ื•ื™ ืžืงืจื™ื ืฉืœ ืžื—ื™ืงื” ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื ืฉื™ืฉ ืœื”ื ืงื™ืฉื•ืจื™ื ืžืื•ื‘ื™ื™ืงื˜ื™ื ืื—ืจื™ื. 

ืงื•ื“ ืžืงื•ืจ

ืื ืงืจืืช ืขื“ ืœื›ืืŸ, ื›ืœ ืžื” ืฉื ื•ืชืจ ื”ื•ื ืœืงืจื•ื ืืช ื”ืงื•ื“; ื ื™ืชืŸ ืœืžืฆื•ื ืื•ืชื• ื‘-GitHub:
https://github.com/DiverOfDark/ObjectRepository

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”