这是一个基本上是一个类库项目,它以某种方式暴露为WCF服务。下面的代码是数据访问层的一部分。 'db'是DataContext类的对象。要保存文件,我们执行以下操作 -
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;
}
然后,下面会执行 -
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 to SQL,并创建了一个DBContext类。 'SaveFileData()'方法实际上是该类的一部分,它只是调用SP内部来保存文件。 我没有遵循的内容 - 究竟是对UsingWrite()的调用在这里做了什么?传递给'Action action'参数的内容是什么?
答案 0 :(得分:2)
我理解你的困惑。他们使用2名代表。
这将传递给action参数:
db =>
{
db.SaveFileData(fileDetails.RunId, fileDetails.FileData, fileDetails.FileExtension, ref id);
}
因此,当调用UsingWrite时,在Write委托中设置的SoftCashCreditDBDataContext委托将调用SaveFileData。
帮助您理解行动的简化示例:
public void Main()
{
Test(x => Debug.Write(x));
}
private void Test(Action<string> testAction)
{
testAction("Bla");
}
此函数将使用参数x调用Debug.Write,该参数是传递给测试操作函数的字符串。