DTO和响应对象之间的区别?

时间:2019-09-23 07:32:18

标签: c# .net asp.net-core architecture request-response

在软件体系结构中,响应对象和DTO有什么区别?假设我要获取目录中的产品列表。

如果这是ProductDTO,则产品响应类有何不同?产品响应通常只是带有日期时间,错误日志或guid的包装,还是主要区别是什么?如果没有确切或多个答案,则想听听业内的首要原因。

public class FormCoachingAdapter extends BaseAdapter<FormCoachingAdapter.FormHolder> {

    private Context context;
    private List<DataQuestion> questionList;
    private List<DataAnswers> answersList;

    public FormCoachingAdapter(Context context, List<DataQuestion> questionList, List<DataAnswers> answersList){
        this.context = context;
        this.questionList = questionList;
        this.answersList = answersList;
    }

    class FormHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.rg_common)
        RadioGroup rgCommon;
        @BindView(R.id.rb_yes)
        RadioButton rbYes;
        @BindView(R.id.rb_no)
        RadioButton rbNo;
        @BindView(R.id.tv_descriptions)
        TextView tvDescriptions;

        FormHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    @NonNull
    @Override
    public FormHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(context)
                .inflate(R.layout.row_common_checklist_two, parent, false);
        return new FormHolder(itemView);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull FormHolder holder, int position) {

        DataQuestion question = questionList.get(position);
        DataAnswers answers = new DataAnswers();

        Gson gson = new Gson();
        System.out.println("DEVELOPER HASIL DATA : " + gson.toJson(answersList));

        answers.setQuestionId(BigInteger.valueOf(Long.valueOf(question.getId())));
        /*answers.setAnswer1("");
        answers.setAnswer2("");*/

        //Handle selection  state 
        if(question.isChecked){
            // already selected
            if(answersList.size() != 0){
            for (DataAnswers dataAnswers : answersList){
                if (dataAnswers.getAnswer1().equals("Y")) {
                    holder.rbYes.setChecked(true);
                } else {
                    holder.rbNo.setChecked(true);
                }
            }
         }else{
             // not selected yet(default)
          }

        holder.rgCommon.setOnCheckedChangeListener((group, checkedId) -> {
            RadioButton rb = holder.itemView.findViewById(checkedId);

            //Handling selection state changed
            question.isChecked(true);


        for (int i=0; i<answersList.size(); i++) {
            if (answersList.get(i).getQuestionId().equals(answers.getQuestionId())) {
                answersList.remove(i);
                break;
            }
        }

        switch (rb.getId()) {
                case R.id.rb_yes:
                    answers.setQuestionId(BigInteger.valueOf(Long.valueOf(question.getId())));
                    answers.setAnswer1("Y");
                    answers.setAnswer2("");
                    answersList.add(answers);
                    break;

                case R.id.rb_no:
                    answers.setQuestionId(BigInteger.valueOf(Long.valueOf(question.getId())));
                    answers.setAnswer1("N");
                    answers.setAnswer2("");
                    answersList.add(answers);
                    break;
            }
        });
        holder.tvDescriptions.setText((position + 1) + ". " + question.getQuestion());
    }

    @Override
    public void onViewAttachedToWindow(@NonNull FormHolder holder) {
        super.onViewAttachedToWindow(holder);
    }

    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        return questionList.size();
    }

}

我尝试使用谷歌搜索这些答案,但没有针对该问题的具体答案,

Reusing DTO for various request/response types vs explicitness of what is required / what should be returned

Data Objects for each layer(DTO vs Entity vs Response objects)

更新

尝试验证答案。似乎Rahul的答案是回答Domain对象和DTO之间的区别。 Thought Response是DTO的包装,不确定是否为真

http://themoderndeveloper.com/the-modern-developer/requesting-a-response/

现在发布在这里:

https://softwareengineering.stackexchange.com/questions/398783/what-is-difference-between-dto-and-response-object

2 个答案:

答案 0 :(得分:0)

据我所见,Response对象可以在DTO的顶部包含一个Status字段,指示请求是否成功;否则,为什么失败了。

但是我不太确定这是一个已记录的规范。

答案 1 :(得分:0)

DTO (Data Transfer Object)是一个对象,它定义如何通过网络或应用程序发送数据。另一方面,Response Object通常保存来自DTO或WebApi's or Data Access的响应数据或对客户端的任何其他响应。

Response Object通常包括特定model or entity or DTO对象的全部/很少属性,而该特定DTO对象通常是public class EmployeeResponseObject { public int Id { get; set; } public string Name { get; set; } public string Designation { get; set; } } 对象的子集。请参见下面的示例。

员工响应对象:

public class EmployeeDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Designation { get; set; }
    public decimal Salary { get; set; }
    public DateTime JoiningDate { get; set; }
    public decimal Tax { get; set; }
}

员工DTO:

EmployeeResponseObject

现在您可以在这里看到。 EmployeeDTOEmployeeResponseObject的子集,这意味着EmployeeDTO的属性少于EmployeeResponseObject。在少数情况下,我们不必将所有信息传递给最终客户。因此,我们将使用EmployeeDTOLINQ获取必需的属性。 您可以使用Response Object将数据从DTO投射到[ResponseType(typeof(EmployeeResponseObject))] public EmployeeResponseObject GetEmployee() { var employee = from e in dbContext.EmployeeDTO select new EmployeeResponseObject() { Id = e.Id, Name = e.Name, Designation = e.Designation }; return employee; }

EmployeeDTO

如果仅使用presentation layer/View, Webforms or ConsoleApp来将信息传递给presentation layer/View,则您的domain layer将与您的DTO Objects紧密耦合。对presentation layer or controllers所做的任何更改都要求您更改DTO,但这不是一个好方法。

有时Response ObjectsDTO与为什么使用单独的对象完全相同。 这看起来可能是不必要的代码重复,但请考虑一下,当您的项目变得特别大时,在一个大型团队中,许多人在不同的应用程序层一起工作。通过良好的编程习惯,在这里使用separate Response objectPresentation layer/View更有意义。当您跳过使用domain layer时,ResponseObject/ViewModelObject```{r this_label} library(knitr) print(opts_current$get()$label) ``` 将紧密耦合。