静态或对象在这种情况下哪个更好?

时间:2011-09-28 19:44:46

标签: c# .net oop

我的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方法作为静态类和方法是错误的吗?如果是这样,为什么?

3 个答案:

答案 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;
        }