2014-02-21 94 views
0

這基本上是一個類庫項目,它以某種方式公開爲WCF服務。下面的代碼是數據訪問層的一部分。 'db'是DataContext類的一個對象。要保存一個文件,我們作出以下需要幫助瞭解下面的.NET代碼

public static Guid SaveFile(FileDetails fileDetails) 
{ 
      System.Nullable<Guid> id = null; 

      SystemDataContext.UsingWrite(db => 
       { 
        db.SaveFileData(fileDetails.RunId, fileDetails.FileData, fileDetails.FileExtension, ref id); 
       }); 
      return id ?? Guid.Empty; 
} 

然後,下面將execute-

public static void UsingWrite(Action<SoftCashCreditDBDataContext> action) 
{ 
      using (var context = new SystemDataContext()) 
      { 
       try 
       { 
        action(context.Write); 
       } 
       catch (Exception ex) 
       { 
        DataAccessExceptionHandler.HandleExcetion(ex, Config.DataLayerPolicy); 
       } 
      } 
    } 


public SystemDataContext() 
     { 
      if (_stack == null) 
      { 
       _stack = new Stack<SystemDataContext>(); 
       this.Depth = 1; 
       this.Read = new SoftCashCreditDBDataContext(Config.ReadDatabaseConnection); 
       this.Write = new SoftCashCreditDBDataContext(Config.WriteDatabaseConnection); 
      } 
      else 
      { 
       var parent = _stack.Peek(); 
       /// Increment level of node. 
       this.Depth = parent.Depth + 1; 
       /// Copy data context from the parent 
       this.Read = parent.Read; 
       this.Write = parent.Write; 
      } 
      _stack.Push(this); 
     } 

     public int Depth { get; private set; } 

     public bool IsRoot { get { return this.Depth == 1; } } 

     [ThreadStatic] 
     private static Stack<SystemDataContext> _stack = null; 

     public SoftCashCreditDBDataContext Read { get; private set; } 
     public SoftCashCreditDBDataContext Write { get; private set; } 

     #region IDisposable Members 

     public void Dispose() 
     { 
      var context = _stack.Pop(); 
      if (context.IsRoot == true) 
      { 
       context.Read.Dispose(); 
       context.Write.Dispose(); 
       _stack = null; 
      } 
     } 

     #endregion 

    } 

他們已經實現了LINQ到SQL這裏,並創建了一個的DbContext類。 'SaveFileData()'方法實際上是該類的一部分,它只是調用一個SP來保存文件。 我沒有關注 - 這裏調用UsingWrite()到底在做什麼?傳遞給「Action action」參數的是什麼,它在做什麼?

回答

2

我明白你的困惑。他們使用2名代表。

這被傳遞到操作參數:

db => 
{ 
    db.SaveFileData(fileDetails.RunId, fileDetails.FileData, fileDetails.FileExtension, ref id); 
} 

所以當UsingWrite被調用,這是在寫委託設置SoftCashCreditDBDataContext委託將調用SaveFileData。

一個簡單的例子,以幫助您瞭解操作:

public void Main() 
{ 
    Test(x => Debug.Write(x)); 
} 

private void Test(Action<string> testAction) 
{ 
    testAction("Bla"); 
} 

此功能將調用Debug.Write與自變量x,這是傳遞給測試動作功能的字符串。