4

我有一个带有一些静态列表的类。出于演示目的,我将只展示两个:

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();
    }
}

我不喜欢将我的数据库上下文传递给每个静态方法。您对不同的方法有什么建议吗?

4

4 回答 4

4

在这种情况下,一个好主意(当然,如果体系结构证明使用静态方法是合理的,但这似乎超出了这个问题的范围)可能会将您的静态方法创建为扩展方法

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();
于 2013-07-02T07:52:20.043 回答
2

我个人不喜欢将dbContext对象作为参数传递的想法。您可以完全分离数据层并将其存储在另一个类中。

public class DataAccess {
   private EFEntities _dbContext { get; set; }

   public EfEntities GetDbContext() {
        if (_dbContext != null) {
             return _dbContext;
        } else {
            _dbContext = new EFEntities(.....);
            return _dbContext;
        }
   }
}

然后您可以引用DataAccess包含您需要的上下文的类,而不是每次都将其作为参数传递。

于 2013-07-02T07:53:10.070 回答
1

不要让它成为静态的。您需要返回这些列表的上下文。静态成员被设计为无上下文。所以基本上你想要的是将这些方法移动到一个类实例中,并通过依赖注入或其他某种工厂在构造时提供一个上下文。

坚持静力学的设计决策是什么?一个糟糕的解决方法是将上下文传递给一个静态字段然后使用它,但这基本上正是你应该对类实例做的事情

于 2013-07-02T07:51:34.663 回答
0

I know this is an old question but I did this solution. At most it is syntax sugar.

public List<Cert> List()
{
    return db.Certs.ToList();
}

public static List<Cert> All()
    {
    return new CertsController().List();
}

Usage:

List<Cert> Certificates = CertsController.All();
于 2018-10-30T16:25:53.940 回答