c# - 如何避免重写相同的 using 语句?

标签 c# entity-framework nested using idisposable

有没有办法在 Disposable 对象中创建嵌套使用,所以这段代码:

using (var ctx = new MyEntities())
{
    ctx.Connection.Open();
    using (var tx = dbContext.Connection.BeginTransaction())
    {
        // ... do awesome things here

        ctx.SaveChanges();
        tx.Commit();
    }
}

像这样:

using (var txContext = new TransactionContext())
{
    // ... do awesome things here
}

目前我有:

public class TransactionContext : IDisposable
{
    private MyEntities DbContext { get; set; }
    private DbTransaction Transaction { get; set; }

    public TransactionContext()
    {
        DbContext = new MyEntities();
        DbContext.Connection.Open();

        Transaction = DbContext.Connection.BeginTransaction();
    }

    void IDisposable.Dispose()
    {
        try
        {
            DbContext.SaveChanges();
            Transaction.Commit();
        }
        catch (Exception exception)
        {
            Transaction.Rollback();
            DbContext.Dispose();
        }
    }
}

我不确定这在处理不同的Disposables方面是否正确,特别是在出现错误/异常的情况下。

最佳答案

为此使用方法而不是类可能会更好。

private static void RunInTransaction(Action<MyEntities, DbTransaction> action)
{
    using (var ctx = new MyEntities())
    {
        ctx.Connection.Open();
        using (var tx = ctx.Connection.BeginTransaction())
        {
            action(ctx, tx);
            ctx.SaveChanges();
            tx.Commit();
        }
    }
}

然后你就可以这样调用它。

RunInTransaction((ctx,tx) => 
{
    // ... do awesome things here
}); 

您还可以创建一个返回值的版本

private static T RunInTransactionAndReturn<T>(
    Func<MyEntities, DbTransaction, T> function)
{
    using (var ctx = new MyEntities())
    {
        ctx.Connection.Open();
        using (var tx = ctx.Connection.BeginTransaction())
        {
            var result = function(ctx, tx);
            ctx.SaveChanges();
            tx.Commit();
            return result;
        }
    }
}

然后你就可以这样调用它。

var result = RunInTransactionAndReturn((ctx,tx) => 
{
    // ... do awesome things here
    return someResult;
}); 

关于c# - 如何避免重写相同的 using 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32524676/

相关文章:

c# - 依赖注入(inject),带参数注入(inject)

c# - 区分和排序列表 LINQ

c# - 在模拟的 EF6 数据库中通过外键加载相关数据

嵌套列表的 C 等价物 (Python)

c# - 我们可以通过编程方式将网站托管到 IIS 吗?

c# - 类型约束中的泛型

asp.net - Asp.Net Mvc 中动态数据的替代方案

mysql - 在 MySQL 中嵌套多个 SELECT 语句的正确方法是什么

elasticsearch - 通过自定义参数进行ElasticSearch无痛脚本过滤

c# - 用投影搭建互动楼层?