اشتراک‌ها
مدیریت مباحث همزمانی مرتبط با یک Rich Domain Model با استفاده از EFCore و الگوی Aggregate

In summary, the most important issues here are:

  • The Aggregate’s main task is to protect invariants (business rules, the boundary of immediate consistency)
  • In a multi-threaded environment, when multiple threads are running simultaneously on the same Aggregate, a business rule may be broken
  • A way to solve concurrency conflicts is to use Pessimistic or Optimistic concurrency techniques
  • Pessimistic Concurrency involves the use of a database transaction and a locking mechanism. In this way, requests are processed one after the other, so basically concurrency is lost and it can lead to deadlocks.
  • Optimistic Concurrency technique is based on versioning database records and checking whether the previously loaded version has not been changed by another thread.
  • Entity Framework Core supports Optimistic Concurrency. Pessimistic Concurrency is not supported
  • The Aggregate must always be treated and versioned as a single unit
  • Domain events are an indicator, that state was changed so Aggregate version should be changed as well 
public class AggregateRootBase : Entity, IAggregateRoot
{
    private int _versionId;

    public void IncreaseVersion()
    {
        _versionId++;
    }
}
internal sealed class OrderEntityTypeConfiguration : IEntityTypeConfiguration<Order>
{
    public void Configure(EntityTypeBuilder<Order> builder)
    {
        builder.Property("_versionId").HasColumnName("VersionId").IsConcurrencyToken();
 
        //...
    }
}
var order = await _ordersContext.Orders.FindAsync(orderId);
order.AddOrderLine(request.ProductCode); 
var domainEvents = DomainEventsHelper.GetAllDomainEvents(order);
if (domainEvents.Any())
{
    order.IncreaseVersion();
}
await _ordersContext.SaveChangesAsync();


مدیریت مباحث همزمانی مرتبط با یک Rich Domain Model با استفاده از EFCore و الگوی Aggregate
اشتراک‌ها
NuGet 6.0 منتشر شد

Announcing NuGet 6.0 - Source Mapping, Package Vulnerabilities, Faster Solution Load 

NuGet 6.0 منتشر شد
مطالب
تغییرات Encoding در NET Core.
فرض کنید قصد دارید یک قطعه کد پیشین تغییر Encoding از ویندوز عربی، به یونیکد را که در Full .NET Framework به خوبی کار می‌کند، در NET Core. اجرا کنید:
var path = @"D:\file1.srt";
var data = System.IO.File.ReadAllText(path, Encoding.GetEncoding("windows-1256"));
System.IO.File.WriteAllText(path, data, Encoding.UTF8);
به محض اجرای این قطعه کد، استثنای ذیل را دریافت خواهید کرد:
 System.ArgumentException: 'windows-1256' is not a supported encoding name. For information on defining a custom encoding, see
the documentation for the Encoding.RegisterProvider method.
Parameter name: name
عنوان می‌کند که encoding مخصوص windows-1256 را نمی‌شناسد. این تغییری است که در نحوه‌ی ثبت سایر Encodings غیریونیکد صورت گرفته‌است.


معرفی اسمبلی System.Text.Encoding.CodePages

تمام Encodings غیریونیکد به اسمبلی ویژه‌ای به نام System.Text.Encoding.CodePages منتقل گردیده‌اند و به صورت پیش‌فرض هم هیچکدام از آن‌ها در سیستم معرفی و ثبت نشده‌اند.
به همین منظور ابتدا باید وابستگی ذیل را به فایل csproj برنامه اضافه کرد:
<ItemGroup>
    <PackageReference Include="System.Text.Encoding.CodePages" Version="4.3.0" />
</ItemGroup>


معرفی کل مجموعه‌ی Encodings غیریونیکد به برنامه

پس از بازیابی این وابستگی با اجرای دستور dotnet restore، اکنون می‌توان کل مجموعه‌ی Encodings موجود در آن‌را به سیستم معرفی نمود:
    public class MyClass 
    {
        static MyClass()
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
        }
این‌کار نیز باید یکبار در طول عمر برنامه انجام شود. به همین جهت می‌توان این معرفی را در آغاز برنامه انجام داد و یا می‌توان آن‌را مانند مثال فوق به یک سازنده‌ی استاتیک منتقل نمود. در این حالت بدون هیچگونه تغییری در کدهای پیشین، امکان اجرای آن‌ها وجود خواهد داشت.


امکان دسترسی به تنها یک Encoding ویژه

قطعه کد عنوان شده، تمام Encoding موجود در اسمبلی System.Text.Encoding.CodePages را به صورت یکجا به سیستم معرفی می‌کند. مزیت آن عدم نیاز به تغییری در کدهای پیشین است؛ اما اگر تنها نیاز به یکی از آن‌ها را دارید، می‌توان به صورت ذیل عمل کرد و دیگر نیازی به ذکر Encoding.RegisterProvider نیست:
 var enc1256 = CodePagesEncodingProvider.Instance.GetEncoding(1256);