我有以下类:
问卷列表Dto.cs
namespace Services.DTOs
{
public class QuestionnaireListDto
{
public IList<QuestionnaireEntryDto> Questionnaires;
public QuestionnaireListDto(IList<QuestionnaireEntryDto> questionnaires)
{
Questionnaires = questionnaires;
}
}
}
问卷输入Dto.cs
namespace Services.DTOs
{
public class QuestionnaireEntryDto
{
// Omitting several properties here for brevity...
public int Id { get; }
public int QnreId { get; }
// Other properties here...
public QuestionnaireEntryDto(QnrsMailed qnrsMailed)
{
Id = qnrsMailed.Id;
QnreId = qnrsMailed.QnreId;
// Initialize other members...
}
}
}
这些 DTO 类由单独的库初始化。然后将这些 DTO 传递到 Razor 视图。我正在使用 ASP.NET 核心数据保护来加密/解密上面的 Id 值。
我正在尝试做的是"附加"上面 Id 属性的加密版本。数据保护 API 创建 ID 的字符串版本。我希望能够在不必创建单独的"EncryptedId"属性的情况下执行此操作。构建 DTO 时,我此时不知道加密的 ID。如果可能的话,我还希望在控制器类中进行加密/解密。
我想不出一种干净的方法来做到这一点。到目前为止,我能想到的最接近的事情是创建一个包含 EncryptedId 属性的泛型包装类,如下所示:
public class EncryptedDto<T> where T : class
{
public string EncryptedId { get; }
public T Dto { get; }
public EncryptedDto(string encryptedId, T dto)
{
EncryptedId = encryptedId
Dto = dto;
}
}
当然,要做到这一点,我必须遍历 DTO 列表,并为每个 DTO 对象构造其中一个。并且还要创建一个新的 DTO 类,该类可以改为存储这些泛型对象的列表。这仍然看起来很混乱/繁琐。有没有更好的方法?
您的解决方案没有错。重新映射 DTO 是一种常见的做法。如果你认为你的映射代码很混乱,你可以使用Automapper来做这些事情。另一种解决方法是使用静态类来委托加密/解密。每当你在视图中使用 and id 时,你都会调用该类的加密方法,以便只呈现加密的 id。