我有以下课程:
QuestionnaireListDto.cs
namespace Services.DTOs
{
public class QuestionnaireListDto
{
public IList<QuestionnaireEntryDto> Questionnaires;
public QuestionnaireListDto(IList<QuestionnaireEntryDto> questionnaires)
{
Questionnaires = questionnaires;
}
}
}
QuestionnaireEntryDto.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 Core数据保护来加密/解密上面的ID值。
我想做的是“附加”上面的Id属性的加密版本。数据保护API创建ID的字符串版本。我希望能够执行此操作,而不必创建单独的“ EncryptedId”属性。构造DTO时,目前我还不知道加密的ID。我还希望尽可能在Controller类中进行加密/解密。
我想不出一种干净的方法来做到这一点。到目前为止,我能想到的最接近的方法是创建一个包含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类,该类可以存储这些通用对象的列表。这仍然显得凌乱/麻烦。有更好的方法吗?
答案 0 :(得分:0)
您的解决方案没有错。重新映射DTO是一种常见的做法。如果您认为映射代码比较混乱,可以使用Automapper来完成。另一个解决方法是使用静态类委派加密/解密。每当在视图中使用id时,都将调用该类的crypto方法,以便仅呈现加密的id。