ObjectRepository - .NET tauira putunga putunga mahara mo o kaupapa kaainga

He aha te mea ka penapena nga raraunga katoa ki te mahara?

Hei rokiroki i nga raraunga o te waahi, o muri ranei, ko te hiahia tuatahi o te nuinga o nga tangata whai whakaaro ko te kowhiri i tetahi papaa raraunga SQL. 

Engari i etahi wa ka puta te whakaaro ko te tauira raraunga kaore i te pai mo te SQL: hei tauira, i te wa e hanga ana he rapunga, he kauwhata hapori ranei, me rapu koe mo nga hononga uaua i waenga i nga taonga. 

Ko te ahuatanga kino rawa atu ko te wa e mahi ana koe i roto i te roopu, kaore tetahi hoa mahi e mohio ki te hanga patai tere. E hia te roa o te wa i whakapaua e koe ki te whakaoti rapanga N+1 me te hanga i etahi atu taurangi kia oti ai te SELECT i te wharangi matua i roto i te wa tika?

Ko tetahi atu huarahi rongonui ko NoSQL. He maha nga tau kua pahure ake nei he maha nga korero mo tenei kaupapa - mo nga wa pai i tukuna e ratou a MongoDB me te koa ki nga whakautu i te ahua o nga tuhinga json (Ae ra, e hia nga tootoo i whakauruhia e koe na nga hononga porohita kei roto i nga tuhinga?).

Ka whakaaro ahau ki te whakamatau i tetahi atu tikanga rereke - he aha e kore ai e ngana ki te penapena i nga raraunga katoa i roto i te mahara tono, ka penapena i ia wa ki te rokiroki matapōkere (kōnae, pātengi raraunga mamao)? 

Kua iti te mahara, a ko nga raraunga ka taea mo te nuinga o nga kaupapa iti me te reo-rahi ka uru ki te 1 GB o te mahara. (Hei tauira, ko taku kaupapa kainga tino pai ko aroturuki pūtea, e pupuri ana i nga tatauranga o ia ra me aku hitori o aku whakapaunga, toenga, me aku whakawhitinga mo te tau me te hawhe, ka pau noa te 45 MB o te mahara.)

Kaupapa:

  • Ka ngawari ake te uru ki nga raraunga - kare koe e awangawanga mo nga paatai, te uta mangere, nga ahuatanga ORM, ka mahi koe me nga taonga C# noa;
  • Kaore he raruraru e pa ana ki te uru mai i nga miro rereke;
  • Tino tere - karekau he tono whatunga, karekau he whakamaoritanga o te waehere ki roto i te reo patai, karekau he take (de)whakaraupapatanga o nga mea;
  • Ka whakaaetia te penapena raraunga ahakoa te ahua - ahakoa kei te XML i runga i te kōpae, kei te SQL Server ranei, kei te Rokiroki Ripanga Azure ranei.

Cons:

  • Kua ngaro te tauine whakapae, a, ko te mutunga mai, kaore e taea te tukunga wa-kore;
  • Mena ka pakaru te tono, ka ngaro pea koe i tetahi waahanga raraunga. (Engari ko ta maatau tono kaore e pakaru, tika?)

Ka pēhea te mahi i te reira?

Ko te algorithm e whai ake nei:

  • I te timatanga, ka whakapumautia he hononga ki te rokiroki raraunga, ka utaina nga raraunga;
  • Ka hangaia he tauira ahanoa, nga tohu tuatahi, me nga tohu hononga (1:1, 1:Many);
  • Ka hangaia he ohaurunga mo nga huringa o nga taonga ahanoa (INotifyPropertyChanged) me te taapiri, te tango ranei i nga huānga ki te kohinga (INotifyCollectionChanged);
  • I te wa e whakaohohia ana te ohaurunga, ka taapirihia te mea kua whakarereketia ki te rarangi mo te tuhi ki te rokiroki raraunga;
  • Ko nga huringa ki te rokiroki ka tiakina i ia wa (i runga i te matawā) ki te miro papamuri;
  • Ka puta koe i te tono, ka tiakina hoki nga huringa ki te rokiroki.

Tauira waehere

Te taapiri i nga whakawhirinaki e tika ana

// Основная библиотека
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

Ka whakaahuahia e matou te tauira raraunga ka penapena ki te rokiroki

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; }
}

Na ko te tauira ahanoa:

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;
}

Ka mutu, ko te akomanga putunga ake mo te uru ki nga raraunga:

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();
    }
}

Waihangahia he tauira ObjectRepository:

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

Mena ka whakamahia e te kaupapa HangFire

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

Kōkuhu ahanoa hōu:

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

Ki tenei karanga, te ahanoa Tauira Matua ka taapirihia ki te keteroki o te rohe me te rarangi mo te tuhi ki te papaunga raraunga. No reira, ka tango tenei mahi i te O(1), ka taea te mahi tonu tenei ahanoa.

Hei tauira, ki te kimi i tenei ahanoa i roto i te putunga me te manatoko he rite tonu te tauira i whakahokia mai:

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

He aha kei te tupu? Tautuhi () hoki mai Papakupu Ripanga, kei roto Papakupu Taurite me te whakarato mahi taapiri o nga tohu tuatahi me te tuarua. Ma tenei ka taea e koe te whai tikanga mo te rapu ma te Id (me etahi atu taurangi kaiwhakamahi kore noa) me te kore e huri katoa i nga mea katoa.

I te taapiri taonga ki ObjectRepository ka taapirihia he ohaurunga ki te whakarereke i o raatau taonga, no reira ko te whakarereketanga o nga taonga ka uru ano tenei mea ki te rarangi tuhi. 
He rite te ahua o te whakahōu i nga taonga o waho ki te mahi me te ahanoa POCO:

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

Ka taea e koe te muku i tetahi mea ma nga huarahi e whai ake nei:

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

Ka taapiri ano tenei i te ahanoa ki te rarangi mukunga.

Me pehea te mahi penapena?

ObjectRepository ka huri nga mea ka tirohia (te taapiri, te whakakore ranei, te whakarereke ranei i nga ahuatanga), ka whakaarahia he huihuinga Tauira Huriohauru ki IS Rokiroki. Whakatinanatanga IS Rokiroki ina puta he kaupapa Tauira Huri Ka whakauruhia nga huringa ki nga rarangi e 3 - mo te taapiri, mo te whakahou, mo te whakakore.

Te whakatinana hoki IS Rokiroki i runga i te arawhitinga, ka waihangahia e ratou he matawā ka tiakina nga huringa ia 5 hēkona. 

I tua atu, he API hei akiaki i te waea whakaora: ObjectRepository.Tiaki().

I mua i ia penapena, ka tangohia tuatahitia nga mahi horihori mai i nga rarangi (hei tauira, nga takahanga taarua - i te wa e rua te whakarereketanga o tetahi mea, ka tere ranei te taapiri/tango ahanoa), katahi ka tiakina ano. 

I nga wa katoa, ka tiakina katoatia te ahanoa o naianei, no reira ka taea te tiaki i nga taonga i roto i te raupapa rereke atu i era i whakarereketia, tae atu ki nga waahanga hou ake o nga mea i te wa i taapirihia ki te rarangi.

He aha atu ano?

  • Ko nga whare pukapuka katoa kei runga i te .NET Standard 2.0. Ka taea te whakamahi i tetahi kaupapa .NET hou.
  • He haumaru te API. Ka whakatinanahia nga kohinga o roto i runga i Papakupu Taurite, he raka nga kaikawe huihuinga, kaore ranei e hiahiatia. 
    Ko te mea anake hei maumahara ko te waea ObjectRepository.Tiaki();
  • Taupū takahuri (me whai ahurei):

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

Ma wai e whakamahi?

Ko ahau ake, i timata ahau ki te whakamahi i tenei huarahi i roto i nga kaupapa whakangahau katoa na te mea he watea, kaore hoki he utu nui mo te tuhi i tetahi paparanga urunga raraunga, ki te whakamahi hanganga taumaha ranei. Ko te mea, ko te penapena raraunga ki roto i te litedb, i te konae ranei he mea nui ki ahau. 

Engari i nga wa o mua, i te wa kua ngaro te tiimata o te EscapeTeams (I whakaaro ahau koinei, he moni - engari kaore, he wheako ano) - whakamahia hei rokiroki raraunga ki te Rokiroki Ripanga Azure.

Mahere mo te heke mai

Kei te pirangi ahau ki te whakatika i tetahi o nga tino ngoikoretanga o tenei huarahi - te whakatauira whakapae. Hei mahi i tenei, ka hiahia koe ki nga whakawhitiwhitinga tohatoha (sic!), Ka whakatauhia ranei kia kore e rereke nga raraunga mai i nga ahuatanga rereke, me whakarereke ranei i runga i te kaupapa "ko wai te mea whakamutunga ka tika."

Mai i te tirohanga hangarau, ka kite ahau i te kaupapa e whai ake nei ka taea:

  • Rokiroki EventLog me te Snapshot hei utu mo te tauira ahanoa
  • Kimihia etahi atu tauira (tapirihia nga waahi mutunga o nga tauira katoa ki nga tautuhinga? udp discovery? master/slave?)
  • Whakatauritehia i waenga i nga kaupapa EventLog ma tetahi algorithm whakaaetanga, penei i te RAFT.

He raru ano kei te awangawanga ahau - ko te whakakore i te riipene, te kitenga ranei o nga keehi mo te whakakorenga o nga mea he hononga mai i etahi atu mea. 

Waehere puna

Mena kua panui katoa koe ki konei, ko te toenga ko te panui i te waehere; ka kitea i runga i GitHub:
https://github.com/DiverOfDark/ObjectRepository

Source: will.com

Tāpiri i te kōrero