2014-02-21 3 views
0

Это в основном проект библиотеки классов, который каким-то образом отображается как служба WCF. Код ниже является частью уровня доступа к данным. 'db' является объектом класса DataContext. Чтобы сохранить файл, мы делаем following-Нужна помощь в понимании ниже кода .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()? Что передается параметру «Действие», и что он делает?

ответ

2

Я понимаю ваше замешательство. Они используют 2 делегата.

Это передается параметр действия:

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

Так что, когда UsingWrite называется, делегат SoftCashCreditDBDataContext, который был установлен в Write делегат будет вызывать SaveFileData.

Упрощенный пример, чтобы помочь вам понять Действие:

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

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

Эта функция будет вызывать Debug.Write с аргументом х, что строка, которая передается в функцию тест действий.

Смежные вопросы