2012-12-30 27 views
5

kod baktığımızda:C# içinde işlem yapılabilir nesneler?

class MyClass { public static int g=1;} 

using (TransactionScope tsTransScope = new TransactionScope()) 
{ 
    //Do stuff here 
    MyClass.g=999; 
    tsTransScope.Complete(); 
} 
  • bölümüne "Burada İşini yap " baktığımızda: onlar Transactionable olabilir böylece orada yazabilirsiniz nesnelerin ne tip? . Zaten ADO komutlarını yazabileceğimi biliyorum ve gerektiğinde geri dönüyor/verilecekler. Ama C# POV yoluyla: Hangi uygulama gerektiği Sınıf Transactionable olmak için sahip olması

  • denemek olan (a using maddesi içine, adı gibi bir TransactionScope ise (bazı arayüz falan uygulayan?) + nihayet) Mantık, eğer geri alma varsa: MyClass.g'un GERİ 1 değerini alması gerektiğini söyler. bu gerçekleşmiyor. Yani sanırım ilk soruyla ilgili. MyClass İşlem Yapabilir nasıl yapabilirim?

+0

İşlem yapılabilir hale getirilecek bazı arayüzler vardır, geri dönerken veya yorum yaparken bir şeyler yapmanız gerekir, öyle mi? –

+0

@MSakherSawan I _assume_ var. Bu benim sorum aslında. –

cevap

8

Sen System.Transactions.IEnlistmentNotification arayüzü, this makale uygulamalıdır ve this hazır işlemsel bellek depolama için size

yardımcı olabilir, orada (Software transactional memory), ve STM.NET bunun nihai şeyler değil, ama Microsoft üzerinde çalışıyor!

Bir küçük örnek:

 using (TransactionScope tr = new TransactionScope()) 
     { 
      TsansactionalFileWriter writer = new TsansactionalFileWriter("c:\\myFile.txt"); 
      writer.AppendText("sdfgssdfgsdf"); 
      tr.Complete(); 
     } 

* EDTI: Royi İÇİN KATMA G BEKÇİ :) *

using System.Transactions; 

namespace Sakher.Transactions 
{ 
    public class Royi_s_gReturnerClass 
    { 
     private GReturnerEnlistment fileTransactionEnlistment = new GReturnerEnlistment(); 
     public Royi_s_gReturnerClass() 
     { 
      Transaction.Current.EnlistVolatile(fileTransactionEnlistment, EnlistmentOptions.None); 
     } 
    } 

    public class GReturnerEnlistment : IEnlistmentNotification 
    { 
     public int GOldValue { get; set; } 

     public GReturnerEnlistment() 
     { 
      GOldValue = MyClass.g; 
     } 

     public void Commit(Enlistment enlistment) 
     { 

     } 

     public void InDoubt(Enlistment enlistment) 
     { 

     } 

     public void Prepare(PreparingEnlistment preparingEnlistment) 
     { 
      preparingEnlistment.Prepared(); 
     } 

     public void Rollback(Enlistment enlistment) 
     { 
      MyClass.g = GOldValue; 
     } 
    } 

} 

Kodunuz olacak kod tüketen

using System.IO; 
using System.Text; 
using System.Transactions; 

namespace Sakher.Transactions 
{ 
    public class TsansactionalFileWriter 
    { 
     private FileTransactionEnlistment fileTransactionEnlistment = new FileTransactionEnlistment(); 
     public TsansactionalFileWriter(string filePath) 
     { 
      fileTransactionEnlistment.FilePath = filePath; 
      Transaction.Current.EnlistVolatile(fileTransactionEnlistment, EnlistmentOptions.None); 
     } 

     public void AppendText(string text) 
     { 
      fileTransactionEnlistment.Content.Append(text); 
     } 

     public void WriteAllText(string text) 
     { 
      fileTransactionEnlistment.Content = new StringBuilder(text); 
     } 
    } 

    public class FileTransactionEnlistment : IEnlistmentNotification 
    { 
     public string FilePath { get; set; } 
     public StringBuilder Content { get; set; } 

     public FileTransactionEnlistment() 
     { 
      Content = new StringBuilder(); 
     } 

     public void Commit(Enlistment enlistment) 
     { 
      File.WriteAllText(FilePath, Content.ToString()); 
     } 

     public void InDoubt(Enlistment enlistment) 
     { 

     } 

     public void Prepare(PreparingEnlistment preparingEnlistment) 
     { 
      //You can create the file here 
      preparingEnlistment.Prepared(); 
     } 

     public void Rollback(Enlistment enlistment) 
     { 
      //Do ssomething when the transaction is rolled-back (You may delete the file if you have created it!) 
     } 
    } 

} 

:

+1

, bu nedenle, bu arabirimi uygularken g değeri 1 olacaktır. Cool –

+0

Değeri, birincil değerine döndürme mantığını yazmalısınız! Küçük ve güzel bir örnek yazıyorum! –

+0

Teşekkürler adamım. iyi cevap. –