我是编程初学者,在 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
};
}
}