Aracılığıyla paylaş


JournaledGrain Temel Bilgileri

Günlüğe kaydedilen tanecikler, aşağıdaki tür parametreleriyle türünden JournaledGrain<TGrainState,TEventBase>türetilir:

  • , TGrainState tahılın durumunu temsil eder. Ortak varsayılan oluşturucuya sahip bir sınıf olmalıdır.
  • TEventBase , bu tanecik için yükseltilebilen tüm olaylar için ortak bir üst türdür ve herhangi bir sınıf veya arabirim olabilir.

Tüm durum ve olay nesneleri seri hale getirilebilir olmalıdır (çünkü günlük tutarlılığı sağlayıcılarının bunları kalıcı hale getirmesi ve/veya bildirim iletilerinde göndermesi gerekebilir).

Olayları POCO'lar (düz eski C# nesneleri) JournaledGrain<TGrainState> olan tanecikler için JournaledGrain<TGrainState,TEventBase>kısaltma olarak kullanılabilir.

Tahıl durumunu okuma

Geçerli taneli durumu okumak ve sürüm numarasını belirlemek için JournaledGrain'in özellikleri vardır

GrainState State { get; }
int Version { get; }

Sürüm numarası her zaman onaylanan olayların toplam sayısına eşittir ve durum, onaylanan tüm olayların ilk duruma uygulanmasının sonucudur. Sürüm 0'a sahip olan ilk durum (hiçbir olay uygulanmadığından), GrainState sınıfının varsayılan oluşturucusunun tarafından belirlenir.

Önemli: Uygulama tarafından Statedöndürülen nesneyi hiçbir zaman doğrudan değiştirmemelidir. Yalnızca okumak içindir. Bunun yerine, uygulama durumu değiştirmek istediğinde, olayları yükselterek dolaylı olarak bunu yapmalıdır.

Olayları tetikle

Olayları oluşturma işlevi çağrılarak RaiseEvent gerçekleştirilir. Örneğin, sohbeti temsil eden bir tanecik, kullanıcının gönderi gönderdiğini belirtmek için bir oluşturabilir PostedEvent :

RaiseEvent(new PostedEvent()
{
    Guid = guid,
    User = user,
    Text = text,
    Timestamp = DateTime.UtcNow
});

Depolama erişimine yazma işleminin başlatıldığını RaiseEvent ancak yazma işleminin tamamlanmasını beklemediğini unutmayın. Birçok uygulama için, olayın kalıcı olduğunu onaylayana kadar beklemek önemlidir. Bu durumda, her zaman için ConfirmEventsbeklenerek izleriz:

RaiseEvent(new DepositTransaction()
{
    DepositAmount = amount,
    Description = description
});
await ConfirmEvents();

açıkça çağırmasanız ConfirmEventsbile olayların sonunda doğrulanacağına ve arka planda otomatik olarak gerçekleştiğine dikkat edin.

Durum geçiş yöntemleri

Olaylar her tetiklenirken çalışma zamanı tahıl durumunu otomatik olarak güncelleştirir. Bir olay oluşturulduktan sonra uygulamanın durumu açıkça güncelleştirmesine gerek yoktur. Ancak, uygulamanın yine de bir olaya yanıt olarak durumun nasıl güncelleştirildiğini belirten kodu sağlaması gerekir. Bu işlem iki yolla yapılabilir.

(a) GrainState sınıfı üzerinde StateTypebir veya daha fazla Apply yöntem uygulayabilir. Genellikle, biri birden çok aşırı yükleme oluşturur ve olayın çalışma zamanı türü için en yakın eşleşme seçilir:

class GrainState
{
    Apply(E1 @event)
    {
        // code that updates the state
    }

    Apply(E2 @event)
    {
        // code that updates the state
    }
}

(b) Tanecik işlevi geçersiz kılabilir TransitionState :

protected override void TransitionState(
    State state, EventType @event)
{
   // code that updates the state
}

Geçiş yöntemlerinin durum nesnesini değiştirmekten başka yan etkileri olmadığı varsayılır ve belirleyici olmalıdır (aksi takdirde, etkileri tahmin edilemez). Geçiş kodu bir özel durum oluşturursa, bu özel durum yakalanıp günlük tutarlılığı sağlayıcısı tarafından verilen günlükteki Orleans bir uyarıya eklenir.

Tam olarak, çalışma zamanı geçiş yöntemlerini çağırdığında seçilen günlük tutarlılığı sağlayıcısına ve yapılandırmasına bağlıdır. Uygulamalar, günlük tutarlılığı sağlayıcısı tarafından özellikle garanti edilen durumlar dışında belirli bir zamanlamaya güvenmemelidir.

Günlük tutarlılığı sağlayıcısı gibi Orleans.EventSourcing.LogStorage bazı sağlayıcılar, tahıl her yüklendiğinde olay dizisini yeniden yürütmektedir. Bu nedenle, olay nesneleri depolama alanından düzgün bir şekilde seri durumdan çıkarılabildiği sürece, sınıfı ve geçiş yöntemlerini kökten değiştirmek GrainState mümkündür. Ancak günlük tutarlılığı sağlayıcısı gibi Orleans.EventSourcing.StateStorage diğer sağlayıcılar için yalnızca GrainState nesne kalıcıdır, bu nedenle geliştiricilerin depolama alanından okunduğunda düzgün seri durumdan çıkarılabilmesini sağlaması gerekir.

Birden çok olay oluşturma

çağrısı ConfirmEventsöncesinde birden çok arama RaiseEvent yapmak mümkündür:

RaiseEvent(e1);
RaiseEvent(e2);
await ConfirmEvents();

Ancak, bu büyük olasılıkla art arda iki depolama erişimine neden olur ve yalnızca ilk olayı yazdıktan sonra tahılın başarısız olması riski doğurabilir. Bu nedenle, genellikle kullanarak aynı anda birden çok olay tetiklemek daha iyidir

RaiseEvents(IEnumerable<EventType> events)

Bu, verilen olay dizisinin atomik olarak depolamaya yazıldığını garanti eder. Sürüm numarası her zaman olay dizisinin uzunluğuyla eşleştiğinden, birden çok olay oluşturulmasının sürüm sayısını bir kerede birden fazla artırdığını unutmayın.

Olay dizisini alma

Temel JournaledGrain sınıftan aşağıdaki yöntem, uygulamanın onaylanan tüm olayların dizisinin belirtilen bir kesimini almasını sağlar:

Task<IReadOnlyList<EventType>> RetrieveConfirmedEvents(
    int fromVersion,
    int toVersion);

Ancak, tüm günlük tutarlılığı sağlayıcıları tarafından desteklenmez. Desteklenmiyorsa veya dizinin belirtilen kesimi artık kullanılamıyorsa, bir NotSupportedException oluşturulur.

En son onaylanan sürüme kadar olan tüm olayları almak için

await RetrieveConfirmedEvents(0, Version);

Yalnızca onaylanan olaylar alınabilir: özelliğinin Versiongeçerli değerinden büyükse toVersion bir özel durum oluşturulur.

Onaylanan olaylar hiçbir zaman değişmediğinden, birden çok örnek veya gecikmeli onay varlığında bile endişelenecek bir yarış yoktur. Ancak, bu gibi durumlarda, özelliğin Version değeri özgeçmişlerin çağrıldığı zamana await RetrieveConfirmedEvents göre daha büyük olabilir, bu nedenle değerinin bir değişkene kaydedilmesi önerilir. Eşzamanlılık Garantileri bölümüne de bakın.