在我工作的项目中,我有查询/更新数据库的类,就像这个,
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的博客详细介绍了一篇很棒的文章,以便开始使用.
这取决于。您是否需要使您的程序成为多线程?您是否需要连接到多个数据库?您是否需要在此类中存储状态?您需要控制连接的生命周期吗?您将来需要数据缓存吗?如果您对其中任何一个的回答是肯定的,静态类将使事情变得尴尬。
我个人的建议是让它成为一个实例,因为这更加面向对象,并且会给您将来可能需要的灵活性。
| 归档时间: |
|
| 查看次数: |
596 次 |
| 最近记录: |