Ana içeriğe atla

Varlıklar (Satır)

  

Varlıklar (Satır)

Serenity varlık sistemi tıpkı Dapper gibi SQL'e aşık bir Mikro-ORM'dir.

NHibernate / Entity Framework gibi tam gelişmiş ORM'lerin aksine Serenity, veritabanlarını akıllı algılama, derleme zamanı denetimi ve kolay yeniden düzenleme ile eşlemek ve sorgulamak için gereken minimum özellikleri sağlar.

Serenity varlıkları genellikle XYZRow gibi adlandırılır Bunlar Serenity.Data.Row'un alt sınıflarıdır .

Basit bir satır sınıfı tanımlayalım:

using Serenity.Data;

public class SimpleRow : Row<SimpleRow.RowFields>
{
    public string Name
    {
        get => fields.Name[this];
        set => fields.Name[this] = value;
    }
    
    public int? Age
    {
        get => return fields.Age[this];
        set => fields.Age[this] = value;
    }
    
    public SimpleRow() 
    {
    }

    public class RowFields : RowFieldsBase
    {
        public StringField Name;
        public Int32Field Age;
    }	
}

Evet, basit bir POCO sınıfından biraz daha karmaşık görünüyor. Bu, bazı özelliklerin, bazı ORM'lerin kullandığı gibi proxy sınıflarını kullanmadan çalışmasını sağlamak için gereklidir.

Bu yapı, sıfır yansımayla sorgular oluşturmamıza, atama takibi yapmamıza ve gerektiğinde INotifyPropertyChanged'ı etkinleştirmemize olanak tanır. Ayrıca özel, kullanıcı tanımlı alanlarla çalışmayı da mümkün kılar.

Satırlar JSON ile serileştirilebilir, dolayısıyla hizmetlerden sorunsuz bir şekilde geri döndürülebilirler. Kullanmak için iyi bir nedeniniz olmadığı sürece fazladan POCO/DTO derslerine ihtiyacınız yoktur.

Bir satır bildiriminin bölümlerini inceleyelim.

public class SimpleRow : Row<SimpleRow.RowFields>

SimpleBurada, veritabanındaki bir tabloya eşlenmesi gereken SimpleRow adında bir varlık tanımlıyoruz .

Buradaki satır son eki gerekli değildir ancak yaygın bir uygulamadır ve diğer sınıf adlarıyla çakışmaları önler.

Tüm varlık sınıfları , alan tanımlarının bulunduğu satır için sınıf Serenity.Data.Row<TFields>türünü kabul eden genel temel sınıftan türetilmelidir .RowFields

public string Name
{
    get => fields.Name[this];
    set => fields.Name[this] = value;
}

Şimdi ilk mülkümüzü ilan ediyoruz. NameBu özellik, tabloda adı verilen bir veritabanı sütunuyla eşleşir Simple.

Burada bir otomatik özelliğin kullanılması mümkün değildir (gibi get; set;). Alan değerleri Field adlı özel bir nesne aracılığıyla okunmalı ve ayarlanmalıdır .

Alan nesneleri WPF bağımlılık özelliklerine çok benzer. Aşağıda bir bağımlılık özelliği beyanı örneği verilmiştir:

public static readonly DependencyProperty MyCustomProperty = 
    DependencyProperty.Register("MyCustom", typeof(string), typeof(Window1));

public string MyCustom
{
    get { return this.GetValue(MyCustomProperty) as string; }
    set { this.SetValue(MyCustomProperty, value); }
}

Burada, özellik meta verilerini içeren ve GetValue ve SetValue yöntemleri aracılığıyla özellik değerini ayarlamamıza ve almamıza olanak tanıyan bir statik bağımlılık özellik nesnesi (MyCustomProperty) tanımlarız Bağımlılık özellikleri, WPF'nin doğrulama, veri bağlama, animasyon ve daha fazlası gibi özellikler sunmasına olanak tanır.

Bağımlılık özelliklerine benzer şekilde, Fieldnesneler sütun meta verileri içerir ve atama izleme, ifade ağaçları olmadan sorgu oluşturma, değişiklik bildirimleri vb. gibi bazı özelliklerin önünü açar.

Bağımlılık özellikleri kullanıldıkları sınıfın statik üyeleri olarak bildirilirken, Field nesneleri RowFields adlı iç içe geçmiş bir sınıfta bildirilir. Bu, Alan veya Özellik son eki eklemek zorunda kalmadan bunları daha kolay gruplandırmaya ve referans vermeye olanak tanır ve varlığımızı alan bildirimlerinden uzak tutar.

RowFields sınıfının bir örneği, belirli bir türün tüm satır örnekleri arasında paylaşılır, dolayısıyla statik bir nesneye de benzer.

public Int32? Age
{
    get => Fields.Age[this];
    set => Fields.Age[this] = value;
}

Ageİşte type ile adlandırılan ikinci özelliğimiz int?.

Serenity varlık özellikleri, veritabanı sütunu geçersiz kılınmasa bile her zaman geçersiz kılınabilir. Sıfır yerine hiçbir zaman sıfır kullanmayız.

Diğer ORM'lerde bir arka planınız varsa bu mantıksız görünebilir, ancak sol/sağ birleştirme aracılığıyla sorgularsanız boş olmayan bir alanın boş bir değere sahip olmasının mümkün olduğunu düşünün. Bu durumda alınan değerin null veya sıfır olduğunu nasıl söyleyebilirsiniz?

Referans türlerinin zaten null olarak değerlendirilebileceğini unutmayın, bu nedenle yazmamalısınız "String?".

public SimpleRow()
{
}

Şimdi SimpleRow'un parametresiz yapıcısını tanımlıyoruz. Yapıcının içine bazı ifadeler yazmanız gerekmediği sürece bu isteğe bağlıdır.

public class RowFields : RowFieldsBase
{
    public StringField Name;
    public Int32Field Age;
}

Burada alan nesnelerini içeren iç içe sınıfımızı tanımlıyoruz. 'dan türetilmelidir Serenity.Data.RowFieldsBaseRowFieldsBase , tablo ve alan meta verilerini içeren, Row ile yakından ilişkili özel bir sınıftır .

StringFieldBir ve bir ilan ettik Int32FieldTürleri mülk türlerine göre belirlenir ve tam olarak eşleşmeleri gerekir.

Adları da özellik adlarıyla eşleşmelidir, aksi takdirde başlatma hatası alırsınız.

Bu alan nesnelerini başlatmadığımız için değerleri başlangıçta boştur.

Serenity, bu alan nesnelerini ilgili özellik bildirimine göre otomatik olarak oluşturur ve bunları özellik adıyla eşleştirir.

Bunları RowFields yapıcısında manuel olarak başlatmak da mümkündür ancak özel özelleştirmeler dışında önerilmez.

StartSharp ve Satır Şablonları

Paketi kullanıyorsanız StartSharpve ona bir referansınız varsa , yukarıdaki satır bildirimini iç içe geçmiş bir sınıf Serenity.Pro.Coderkullanarak basitleştirmek mümkündür :RowTemplate

public partial class SimpleRow
{
    private class RowTemplate
    {
        public string Name { get; set; }
        public int? Age { get; set; }
    }
}

Bu, orijinal satır tanımından daha basit görünüyor ancak işlevsel olarak eşitler.

Kaynak oluşturucu Serenity.Pro.Codersizin için aşağıdaki kısmi sınıfı oluşturur:

using Serenity.Data;

partial class SimpleRow : Row<SimpleRow.RowFields>
{
    private string name;
    private int? age;

    public string Name
    {
        get => fields.Name[this];
        set => fields.Name[this] = value;
    }

    public int? Age
    {
        get => fields.Age[this];
        set => fields.Age[this] = value;
    }

    public partial class RowFields : RowFieldsBase
    {
        public StringField Name;
        public Int32Field Age;

        protected override void CreateGeneratedFields()
        {
            Name = new StringField(this, "Name", null, 0, FieldFlags.Default,
                getValue: row => ((SimpleRow)row).name,
                setValue: (row, value) => ((SimpleRow)row).name = value);

            Age = new Int32Field(this, "Age", null, 0, FieldFlags.Default,
                getValue: row => ((SimpleRow)row).age,
                setValue: (row, value) => ((SimpleRow)row).age = value);
        }
    }
}

Bu blogdaki popüler yayınlar

Code generetor ile oluşturulan dosyaların açıklamaları

  1. Sunum (Presentation/UI) Katmanı (Kullanıcı arayüzü - HTML, TypeScript, Dialog, Grid) 🔹 XYZPage.ts 📌 Ne İşe Yarar? Kullanıcı arayüzünün TypeScript tarafındaki tanımıdır. Serenity'nin Dialog ve Grid bileşenlerini içeren bir TypeScript sınıfıdır. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kullanıcıdan veri almak ve göstermek için kullanılır. 🔹 XYZGrid.ts 📌 Ne İşe Yarar? Tablo (Grid) yapısını oluşturur ve verileri listeler. Filtreleme, sıralama ve sayfalama işlemleri için kullanılır. columnsKey ile hangi kolonların gösterileceğini belirler. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kullanıcının verileri listelediği ve etkileşimde bulunduğu yerdir. 🔹 XYZDialog.ts 📌 Ne İşe Yarar? CRUD (Create, Read, Update, Delete) işlemlerini yöneten pencere (modal) bileşeni Kullanıcı form aracılığıyla veri ekler, günceller veya siler. XYZForm.cs ile birlikte çalışır. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kull...

Serenity Web Nedir?

   Serenity  , açık kaynak teknolojileri üzerine kurulu bir ASP.NET Core/TypeScript uygulama platformudur. Standart kodlardan kaçınarak, tekrarlanan görevlere harcanan zamanı azaltarak ve en iyi yazılım tasarımı uygulamalarını uygulayarak bakım maliyetlerini düşürürken geliştirmeyi kolaylaştırmayı amaçlamaktadır. Serene  , Serenity platformunu temel alan ücretsiz, açık kaynaklı başlangıç ​​uygulama şablonumuzdur.  Bu dokümantasyon aracılığıyla eğitimimiz ve diğer örnekler için esas olarak Serene'yi kullanacağız. StartSharp  , ücretli müşterilerimize sunduğumuz premium uygulama şablonudur.  Daha gösterişli bir temaya ve bazı ekstra özelliklere  ek olarak Serene'deki her şeyi içerir  .  İkisi de Serenity platformunu temel alıyor. Adında Ne Var Serenity'nin sözlük anlamları  barış  ,  rahatlık  ve  sakinliktir  . Serenity ile bunu başarmaya çalışıyoruz.  Umarız yükledikten ve kullandıktan sonra siz de bu ş...