包装具有1个其他属性的对象列表

时间:2019-04-17 05:03:48

标签: c# data-protection

我有以下课程:

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类,该类可以存储这些通用对象的列表。这仍然显得凌乱/麻烦。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您的解决方案没有错。重新映射DTO是一种常见的做法。如果您认为映射代码比较混乱,可以使用Automapper来完成。另一个解决方法是使用静态类委派加密/解密。每当在视图中使用id时,都将调用该类的crypto方法,以便仅呈现加密的id。