将数据库上下文传递给静态方法
本文关键字:静态方法 数据库 上下文 | 更新日期: 2023-09-27 18:20:36
我有一个带有一些静态列表的类。出于示范目的,我只展示两个:
public class Foo
{
public static readonly List<long> FirstList(EfEntities dbContext)
{
return dbContext.SomeTable.Where(x => x == 1).ToList();
}
public static readonly List<long> SecondList(EfEntities dbContext)
{
return dbContext.SomeTable.Where(x => x == 2).ToList();
}
}
我不太喜欢把我的数据库上下文传递给每一个静态方法。你对不同的方法有什么建议吗?
在这种情况下(当然,如果静态方法的使用是由体系结构证明的,但这似乎超出了这个问题的范围),一个好主意可能是将静态方法创建为扩展方法:
public static class EfEntitiesExtensions
{
public static readonly List<long> FirstList(this EfEntities dbContext)
{
return dbContext.SomeTable.Where(x => x == 1).ToList();
}
public static readonly List<long> SecondList(this EfEntities dbContext)
{
return dbContext.SomeTable.Where(x => x == 2).ToList();
}
}
之后你可以这样称呼他们:
...
EfEntities dbContext = new EfEntities();
List<long> firstList = dbContext.FirstList();
我个人不喜欢将dbContext
对象作为参数传递。您可以完全分离数据层,并将其存储在另一个类中。
public class DataAccess {
private EFEntities _dbContext { get; set; }
public EfEntities GetDbContext() {
if (_dbContext != null) {
return _dbContext;
} else {
_dbContext = new EFEntities(.....);
return _dbContext;
}
}
}
然后,您可以引用包含所需上下文的DataAccess
类,而不是每次都将其作为参数传递。
不要使它成为静态的。您需要返回这些列表的上下文。静态成员被设计为无上下文。因此,基本上,您想要的是将这些方法移动到类实例中,并通过依赖注入或其他类型的工厂在构建时提供上下文。
坚持静态的设计决策是什么?一个糟糕的解决方法是将上下文传递给静态字段一次,然后使用它,但这基本上正是您应该对类实例
我知道这是一个老问题,但我做了这个解决方案。最多是语法糖。
public List<Cert> List()
{
return db.Certs.ToList();
}
public static List<Cert> All()
{
return new CertsController().List();
}
用法:
List<Cert> Certificates = CertsController.All();