Ana içeriğe atla

Connections and Transactions

 

Bağlantılar ve İşlemler

Serenity, .NET'teki IDbConnection, DbCommand vb. gibi temel veri erişim nesnelerini kullanır.

Bağlantı oluşturmak, parametre eklemek, sorguları yürütmek vb. için bazı temel yardımcılar sağlar.

ISql Bağlantıları Arayüzü

ISqlConnections , veritabanından bağımsız bir şekilde bağlantı oluşturmaya yönelik bir fabrika arayüzüdür.

public interface ISqlConnections : IConnectionStrings
{
    IDbConnection New(string connectionString, string providerName, ISqlDialect dialect);
    IDbConnection NewByKey(string connectionKey);
}

Newiçindeki yöntem, tam ISqlConnectionsbağlantı dizesini, sağlayıcı adını ve kullanılması gereken lehçe örneğini belirterek bir yöntem oluşturur.

Yöntem NewByKey, anahtarıyla bir bağlantı oluşturmak içindir:

public class SomeClass
{
    private ISqlConnections sqlConnections;

    // assuming ISqlConnections is injected via dependency injection
    public SomeClass(ISqlConnections sqlConnections)
    {
        this.sqlConnections = sqlConnections ??
            throw new ArgumentNullException(nameof(sqlConnections));
    }

    public void SomeOperation()
    {
        using (var connection = sqlConnections.NewByKey("Northwind"))
        {
            // do something with the connection instance
            // as long as you use Serenity connection extension
            // methods to query the database, you don't have to
            // manually open the connection
        }
    }
}

DefaultSqlConnectionsISqlConnections olan varsayılan uygulama, dosyadaki bölümden bağlantı tanımını bularak bir bağlantı oluşturur :Dataappsettings.json

  "Data": {
    "Default": {
      "ConnectionString": "...",
      "ProviderName": "System.Data.SqlClient"
    },
    "Northwind": {
      "ConnectionString": "...",
      "ProviderName": "System.Data.SqlClient"
    }
  }

Oluşturulması gereken bağlantı türü özellikte belirtilir ProviderNameRegisterDataProvidersSağlayıcı adları ve bunların bağlantı fabrikaları , dosyadaki yöntemle eşlenir Startup.cs:

public static void RegisterDataProviders()
{
    DbProviderFactories.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance);
    DbProviderFactories.RegisterFactory("Microsoft.Data.SqlClient", SqlClientFactory.Instance);
    DbProviderFactories.RegisterFactory("Microsoft.Data.Sqlite", Microsoft.Data.Sqlite.SqliteFactory.Instance);

    // to enable FIREBIRD: add FirebirdSql.Data.FirebirdClient reference, set connections, and uncomment line below
    // DbProviderFactories.RegisterFactory("FirebirdSql.Data.FirebirdClient", FirebirdSql.Data.FirebirdClient.FirebirdClientFactory.Instance);
    // ...
}

Yukarıda listelendiği gibi, varsayılan olarak yalnızca SQL Server ve SQLitebağlantı fabrikaları kaydedilir. Başka türde bir sunucu kullanmak istiyorsanız, ilgili satırın açıklamasını kaldırmalı ve istemci kitaplığı için NuGet referansını proje dosyasına eklemelisiniz.

ve diğer ilgili hizmetler için varsayılan uygulamalar, AddSqlConnectionsISqlConnections çağrısı aracılığıyla kaydedilir Yöntem tarafından dolaylı olarak çağrıldığı için dosyada göremeyebilirsiniz .Startup.csAddServiceHandlers

SqlConnectionExtensions.NewFor <TClass>uzatma yöntemi

Bağlantı dizesi anahtarlarını ezberlemek istemiyorsanız, bunun yerine bir satırdaki bilgileri (öznitelik biçiminde ConnectionKey) yeniden kullanmak istiyorsanız, bu değişkeni tercih edebilirsiniz.

ConnectionKeyRow sınıfının üstüne baktığınızda, tarafından oluşturulan özelliği görebilirsiniz Sergen:

[ConnectionKey("Northwind")]
public class CustomerRow
{
}

Müşteriler için sorgulama yapacağınız zaman, sabit kodlama yerine "Northwind"bu bilgileri aşağıdakilerden yeniden kullanabilirsiniz CustomerRow:

using (var connection = sqlConnections.NewFor<CustomerRow>()) 
{
    return connection.List<CustomerRow>();
}

Bu şuna karşılık gelir SqlConnections.NewByKey("Northwind").

Uzantı yöntemi bağlantıyı otomatik olarak açtığı için burada bağlantıyı açmamız gerekmedi List.

Bu yöntemle kullanılan sınıfın bir olması gerekmez ; çoğu zaman bir satır türü olsa bile, özniteliği olan Rowherhangi bir sınıf işe yarayacaktır.ConnectionKey

Sarılmış Bağlantı

Kendinize şunu sorabilirsiniz: Sadece yazmak yerine ISqlConnectionsarayüzü, arayüzü Newve yöntemlerini kullanmanın anlamı nedir ?NewByKeynew SqlConnection()

Tüm ISqlConnectionsyöntemler bir nesne döndürür IDbConnectionSqlConnectionBunun bir , , vb. olmasını beklersiniz FirebirdConnection, ancak bu tam olarak doğru değil.

Döndürdükleri IDbConnection nesnesi, WrappedConnectiontemeldeki bir SqlConnection veya FirebirdConnection vb.'yi saran bir örnektir.

Bu, Serenity'nin otomatik açma, lehçe desteği, varsayılan işlemler, iş birimi düzeni, test edilebilirlik için bağlantıları geçersiz kılma vb. gibi bazı özellikleri sağlamasına yardımcı olur.

Döndürülen IDbConnection örnekleriyle çalışırken bu ayrıntıları fark edemeyebilirsiniz. Tıpkı temel bağlantılar gibi davranacaklar.

ISqlConnectionsAncak bağlantı kurma yöntemlerini tercih etmelisiniz . Aksi takdirde listelenen bu özelliklerden bazılarını kaybedebilirsiniz.

Bağlantılar için Veritabanı Lehçesini Ayarlama

"providerName"Serenity, dosyadaki appsettings.jsonbağlantı tanımı için kullanılan lehçeyi kullanarak bir bağlantının lehçesini otomatik olarak belirlemeye çalışır .

Bazen, kullanılarak otomatik olarak belirlenen lehçe işinize yaramayabilir veya bazı bağlantılar için veya "providerName"benzeri bir lehçe kullanmak isteyebilirsiniz .SqlServer2000SqlServer2005

Varsayılan bir genel lehçe ayarlamak mümkün olsa da, otomatik algılamayı geçersiz kılmaz:

SqlSettings.DefaultDialect = SqlServer2005Dialect.Instance;

"Northwind" ve "Varsayılan" bağlantıların sağlayıcı adı olduğundan , genel lehçeyi geçersiz kılsanız bile System.Data.SqlClientSerenity otomatik olarak lehçelerini olarak ayarlayacaktır .SqlServer2012

Dosyadaki bağlantı tanımında lehçeyi ayarlamak mümkündür appsettings.json:

{
  "Data": {
    "Default": {
      "ConnectionString": "...",
      "ProviderName": "System.Data.SqlClient",
      "Dialect": "SqlServer2012"
    }
  }
}

Serenity'nin sağladığı lehçeler için yalnızca lehçe sınıfı adını belirtmeniz yeterlidir.

Özel bir lehçe tanımladıysanız sınıfın tam adını ve derleme adını kullanmanız gerekebilir:

{
  "Data": {
    "Default": {
      "ConnectionString": "...",
      "ProviderName": "System.Data.SqlClient",
      "Dialect": "MyProject.MyNamespace.MyCustomSqlDialect, MyProject.Web"
    }
  }
}

UnitOfWork ve IUnitOfWork

UnitOfWorkyalnızca bir işlem referansı içeren basit bir nesnedir. Ekleyebileceğimiz iki ekstra olay var OnCommitve bunlar OnRollback.

Diyelim ki görevler oluşturuyoruz ve bu görevlerin başarıyla veritabanına kaydedilmesi durumunda bazı e-postaların gönderilmesi gerekiyor.

İşlem yapılmadan önce acele edip bu e-postaları gönderirsek, işlemin başarısız olması durumunda, var olmayan görevler için gönderilen e-postalarla karşı karşıya kalabiliriz. Bu nedenle, e-postayı yalnızca işlem başarılı bir şekilde gerçekleştirilirse, örneğin `OnCommit`` olayında göndermeliyiz.

Önce Commit the transaction'ı ve ardından e-postaları gönder diyebilirsiniz, ancak ya Görev Oluştur hizmet çağrımız daha büyük bir operasyonun sadece bir adımıysa, yani işlemi kontrol etmiyoruz ve tüm adımlar başarılı olduktan sonra gerçekleştirilmesi gerekiyorsa ne olur? ?

Başka bir senaryo ise dosyaların yüklenmesiyle ilgilidir. Bu sefer dosya içeren bir öğeyi güncelliyoruz ve diyelim ki eski bir dosyayı yüklenen yeni dosyayla değiştiriyoruz. İşlem sonucu netleşmeden önce tekrar acele edip eski dosyayı silersek ve işlem sonunda başarısız olursa, diskte gerçek bir eski dosya olmayan bir dosya varlığına sahip oluruz. Bu yüzden event içerisinde dosyayı silip yeni dosya ile değiştirmeli OnCommit, event içerisinde ise yüklenen dosyayı kaldırmalıyız OnRollback.

void SomeBatchOperation() 
{
    using (var connection = sqlConnections.NewByKey("Default"))
    using (var uow = new UnitOfWork(connection))
    {
        // here we are in a transaction context
        // create several tasks in transaction
        CreateATask(new TaskRow { ... });
        CreateATask(new TaskRow { ... });
        //...
        
        // commit the transaction
        // if any exception occurs here or at prior
        // lines transaction will rollback
        // and no e-mails will be sent
        uow.Commit();
    }
}

void CreateATask(IUnitOfWork uow, TaskRow task)
{
    // insert task using the connection wrapped inside IUnitOfWork
    // this will automatically run in the current transaction context
    uow.Connection.Insert(task);
   
    uow.OnCommit += () => {
       // send e-mail for this task now, this method will only
       // be called if the transaction commits successfully
    };
    
    uow.OnRollback += () => {
       // optional, do something else if it fails
    };
}

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 ş...