gpt4 book ai didi

c# - 正确使用数据上下文的 "Using"语句

转载 作者:太空狗 更新时间:2023-10-29 18:16:37 24 4
gpt4 key购买 nike

我正在使用 Linq to Entities,最近,我发现很多人建议将数据上下文包装在这样的 using 语句中:

Using(DataContext db = new DataContext) {
var xx = db.customers;
}

这是有道理的。但是,我不确定如何将这种做法纳入我的模型中。例如:我有一个接口(interface)(我们称它为客户),它是由这样的存储库实现的:

namespace Models
{
public class rCustomer : iCustomer
{

readonly DataContext db = new DataContext();

public customer getCustomer(Guid id)
{
return db.customers.SingleOrDefault(por => por.id == id);
}

public iQueryable<customer> getTopCustomers()
{
return db.customers.Take(10);
}

//*******************************************
//more methods using db, including add, update, delete, etc.
//*******************************************

}
}

然后,为了利用 using,我需要将方法更改为如下所示:

namespace Models
{
public class rCustomer : iCustomer
{
public customer getCustomer(Guid id)
{
using(DataContext db = new DataContext()) {
return db.customers.SingleOrDefault(por => por.id == id);
}
}

public iQueryable<customer> getTopCustomers()
{
using(DataContext db = new DataContext()) {
return db.customers.Take(10);
}
}

//*******************************************
//more methods using db
//*******************************************

}
}

我的问题是:使用“Using”的建议真的那么好吗?请考虑到这个变化将是一个重大变化,我有大约 25 个接口(interface)/存储库组合,每个有大约 20-25 个方法,更不用说完成后需要重新测试所有内容。还有其他办法吗?

谢谢!

埃德加。

最佳答案

您可以实现一个数据库工厂,这将导致您的DbContext 被重用

您可以按如下方式实现:

数据库工厂类:

public class DatabaseFactory : Disposable, IDatabaseFactory
{
private YourEntities _dataContext;
public YourEntities Get()
{
return _dataContext ?? (_dataContext = new YourEntities());
}
protected override void DisposeCore()
{
if (_dataContext != null)
_dataContext.Dispose();
}
}

Repository 基类的摘录:

 public abstract class Repository<T> : IRepository<T> where T : class
{
private YourEntities _dataContext;
private readonly IDbSet<T> _dbset;
protected Repository(IDatabaseFactory databaseFactory)
{
DatabaseFactory = databaseFactory;
_dbset = DataContext.Set<T>();
}

protected IDatabaseFactory DatabaseFactory
{
get;
private set;
}

protected YourEntities DataContext
{
get { return _dataContext ?? (_dataContext = DatabaseFactory.Get()); }
}

您的表的存储库类:

public class ApplicationRepository : Repository<YourTable>, IYourTableRepository
{
private YourEntities _dataContext;

protected new IDatabaseFactory DatabaseFactory
{
get;
private set;
}

public YourTableRepository(IDatabaseFactory databaseFactory)
: base(databaseFactory)
{
DatabaseFactory = databaseFactory;
}

protected new YourEntities DataContext
{
get { return _dataContext ?? (_dataContext = DatabaseFactory.Get()); }
}

}
public interface IYourTableRepository : IRepository<YourTable>
{
}
}

这也可以与 AutoFac 构造函数注入(inject)完美结合。

关于c# - 正确使用数据上下文的 "Using"语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10282050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com