我应该让这个类静态吗?

sea*_*717 5 c#

在我工作的项目中,我有查询/更新数据库的类,就像这个,

public class CompanyInfoManager
{
    public List<string> GetCompanyNames()
    {
         //Query database and return list of company names
    }
}
Run Code Online (Sandbox Code Playgroud)

随着我不断创建越来越多的这类类,我意识到也许我应该使这种类静态.通过这样做,显而易见的好处是避免每次需要查询数据库时都需要创建类实例.但是因为对于静态类,只有一个类的副本,这会导致数百个请求只争用一个静态类的副本吗?

谢谢,

bra*_*mus 12

我不会使该类静态,而是使用依赖注入并将所需的资源传递给该类.这样您就可以创建一个模拟存储库(实现IRepository接口)来进行测试.如果你使类静态并且没有传入你的存储库那么它很难测试,因为你无法控制静态类连接的内容.

注意:下面的代码是一个粗略的例子,仅用于表达这一点,不一定是编译和执行.

public interface IRepository
{
   public DataSet ExecuteQuery(string aQuery);
   //Other methods to interact with the DB (such as update or insert) are defined here.
}

public class CompanyInfoManager
{
   private IRepository theRepository;
   public CompanyInfoManager(IRepository aRepository)
   {
      //A repository is required so that we always know what
      //we are talking to.
      theRepository = aRepository;
   }

   public List<string> GetCompanyNames()
   {
      //Query database and return list of company names
      string query = "SELECT * FROM COMPANIES";
      DataSet results = theRepository.ExecuteQuery(query);
      //Process the results...
      return listOfNames;
   }
}
Run Code Online (Sandbox Code Playgroud)

要测试CompanyInfoManager:

//Class to test CompanyInfoManager
public class MockRepository : IRepository
{
   //This method will always return a known value.
   public DataSet ExecuteQuery(string aQuery)
   {
      DataSet returnResults = new DataSet();
      //Fill the data set with known values...
      return returnResults;
   }
}

//This will always contain known values that you can test.
IList<string> names = new CompanyInfoManager(new MockRepository()).GetCompanyNames();
Run Code Online (Sandbox Code Playgroud)

关于依赖注入,我不想絮絮叨叨. Misko Hevery的博客详细介绍了一篇很棒的文章,以便开始使用.


Dan*_*Dan 2

这取决于。您是否需要使您的程序成为多线程?您是否需要连接到多个数据库?您是否需要在此类中存储状态?您需要控制连接的生命周期吗?您将来需要数据缓存吗?如果您对其中任何一个的回答是肯定的,静态类将使事情变得尴尬。

我个人的建议是让它成为一个实例,因为这更加面向对象,并且会给您将来可能需要的灵活性。