我的WCF方法看起来像这样:
public GetRecordsResponse GetRecords(GetRecordsRequest request)
{
GetRecordsResponse response = new GetRecordsResponse();
Util.GetRecords.VerifyMandatoryParameters(request);
//make sure mandatory parameters have correct values.
Util.GetRecords.SetDefaultValues(request);
Util.GetRecords.SetDefaultResponseValues(request, response);
DataReader.GetRecords.GetAllRecords(request, response);
return response;
}
我将整个DAL和许多Helper方法作为静态类和方法是错误的吗?如果是这样,为什么?
答案 0 :(得分:1)
这是主观问题,但我认为静态方法一般都是邪恶的(除非极少数情况)。
这是一个讨论为什么这是一个问题的讨论的链接: http://misko.hevery.com/2008/11/11/clean-code-talks-dependency-injection/
虽然说话者正在谈论Java,但它是非常相似的语言,并且静态方法在两种语言中的使用方式几乎相同。
答案 1 :(得分:1)
使用静态方法可以访问属性和字段等实例变量,这意味着您需要将请求传递给每个方法。
如果你使用了GetRecords的实例,你可以做一些谎言
GetRecords gr = new gr();
gr.Request = request;
gr.VerifyMandatoryParameters();
gr.SetDefaultValues();
gr.SetDefaultResponseValues(response);
gr.GetAllRecords();
此外,如果您使用流畅的界面,您可以像这样编写它。
GetRecords gr = new gr();
gr.SetRequest(request)
.VerifyMandatoryParameters()
.SetDefaultValues()
.SetDefaultResponseValues(response)
.GetAllRecords();
但你所做的事情并没有“错误”
答案 2 :(得分:1)
简而言之,是的。
我想你对你的代码进行了很少甚至没有单元测试。如果您计划在任何时候添加任何内容;一个静态访问的DAL将导致你没有悲伤的结局(我正在处理这个确切的情况)。
相反,您应该传入,例如 DataAccessService 接口,可以模拟测试,并实现指向生产中的实际数据存储。
所以,我希望你的代码看起来更像:
public GetRecordsResponse GetRecords(GetRecordsRequest request, DataAccessService dataAccess)
{
var response = new GetRecordsResponse();
Util.GetRecords.VerifyMandatoryParameters(request);
Util.GetRecords.SetDefaultValues(request);
Util.GetRecords.SetDefaultResponseValues(request, response);
dataAccess.GetAllRecords(request, response);
return response;
}