2013-07-02 56 views
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(); 
    } 
} 

我不是通过我的数据库上下文到每个静态方法的忠实粉丝。你对不同的方法有什么建议吗?

+1

如果您首先解释您不喜欢的内容以及您使用它的上下文,这将有所帮助。例如,为什么不把上下文包含在另一个具有这些实例方法的类中? –

+0

@JonSkeet在我的第一次测试中,我有静态硬编码列表。但是我希望代码能够被更多的数据驱动,所以我想将它改为我首先硬编码的实际表键。我想你的建议方法是要走的路。 – Johan

回答

1

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

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

+0

感谢您的提示。当我有硬编码列表时,我将它们设为静态。我认为这是改变类型的好时机 – Johan

4

这种情况下的一个好主意(当然如果使用静态方法通过该架构合理的,但是这似乎是出了这个问题的范围)可能创建静态方法作为extension methods

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(); 
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类,其中包含你需要,而不是每次都将它作为一个参数的上下文。

相关问题