如何在DTO响应对象中执行服务逻辑?

问题描述 投票:0回答:0

我是编程初学者,在 ASP.NET Core MVC 中开发我的宠物项目来学习英语单词。我想根据单词的其他属性执行计算,并使用 DTO 响应对象中的公式获得学习单词的优先级。目前,我在 UserWords 对象的扩展方法中执行计算。

using EnjOffer.Core.Domain.Entities;
using EnjOffer.Core.Services;

namespace EnjOffer.Core.DTO
{
    public class UserWordsResponse
    {
        public Guid UserWordId { get; set; }
        public string? Word { get; set; }
        public string? WordTranslation { get; set; }
        public DateTime? LastTimeEntered { get; set; }
        public int CorrectEnteredCount { get; set; }
        public int IncorrectEnteredCount { get; set; }
        public double Priority { get; set; }
        public Guid UserId { get; set; }

        public override bool Equals(object? obj)
        {
            if (obj == null)
            {
                return false;
            }

            if (obj.GetType() != typeof(UserWordsResponse))
            {
                return false;
            }
            UserWordsResponse userWord_to_compare = (UserWordsResponse)obj;
            return UserWordId == userWord_to_compare.UserWordId &&
                Word == userWord_to_compare.Word &&
                WordTranslation == userWord_to_compare.WordTranslation &&
                LastTimeEntered == userWord_to_compare.LastTimeEntered &&
                CorrectEnteredCount == userWord_to_compare.CorrectEnteredCount &&
                IncorrectEnteredCount == userWord_to_compare.IncorrectEnteredCount &&
                Priority == userWord_to_compare.Priority &&
                UserId == userWord_to_compare.UserId;
        }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Major Bug", "S3249:Classes directly extending \"object\" should not call \"base\" in \"GetHashCode\" or \"Equals\"", Justification = "<Pending>")]
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
    }

    public static class UserWordsResponseExtensions
    {
        public static UserWordsResponse ToUserWordsResponse(this UserWords userWords)
        {
            return new UserWordsResponse()
            {
                UserWordId = userWords.UserWordId,
                Word = userWords.Word,
                WordTranslation = userWords.WordTranslation,
                LastTimeEntered = userWords.LastTimeEntered,
                CorrectEnteredCount = userWords.CorrectEnteredCount,
                IncorrectEnteredCount = userWords.IncorrectEnteredCount,
                Priority = (userWords.LastTimeEntered is not null) ? ((double)userWords.CorrectEnteredCount / (userWords.IncorrectEnteredCount +
                userWords.CorrectEnteredCount) * (1 - Math.Exp(-(double)(DateTime.Now - userWords.LastTimeEntered).Value.Hours / 3))) : 0,
                UserId = userWords.UserId
            };
        }
    }
}

但是,我认为这不是好的做法。也许,最好在 UserWordsService.cs 类中创建一个方法 GetPriority() 并在扩展方法中调用它。但是,该怎么做呢?我是否需要在 ToUserWordsResponse() 扩展方法中创建 UserWordsService 类的实例,还是有更好的方法?

这样做是个好习惯吗:

在 UserWordsService 中创建 GetPriority:

using EnjOffer.Core.Domain.Entities;
using EnjOffer.Core.DTO;
using EnjOffer.Core.Helpers;
using EnjOffer.Core.ServiceContracts;

namespace EnjOffer.Core.Services
{
    public class UserWordsService : IUserWordsService
    {
        private readonly List<UserWords> _userWords;

        public UserWordsService()
        {
            _userWords = new List<UserWords>();
        }

        public double GetPriority(DateTime? lastTimeEntered, int correctlyEntered, int incorrectlyEntererd)
        {
            return (lastTimeEntered is not null) ? ((double)correctlyEntered / (incorrectlyEntererd +
                correctlyEntered) * (1 - Math.Exp(-(double)(DateTime.Now - lastTimeEntered).Value.Hours / 3))) : 0;
        }
    }
}

在返回 DTO 响应的扩展方法中创建 UserWordsService 实例:

public static class UserWordsResponseExtensions
    {
        public static UserWordsResponse ToUserWordsResponse(this UserWords userWords)
        {
            UserWordsService userWordsService = new UserWordsService();
            double priority = userWordsService.GetPriority(userWords.LastTimeEntered, userWords.CorrectEnteredCount, userWords.IncorrectEnteredCount);

            return new UserWordsResponse()
            {
                UserWordId = userWords.UserWordId,
                Word = userWords.Word,
                WordTranslation = userWords.WordTranslation,
                LastTimeEntered = userWords.LastTimeEntered,
                CorrectEnteredCount = userWords.CorrectEnteredCount,
                IncorrectEnteredCount = userWords.IncorrectEnteredCount,
                Priority = priority,
                UserId = userWords.UserId
            };
      }
}
asp.net-mvc model-view-controller dependency-injection dto code-organization
© www.soinside.com 2019 - 2024. All rights reserved.