【发布时间】:2017-07-05 17:46:09
【问题描述】:
我的ViewModel 类中的Id 属性可以设置,但由于setter 加密了值,所以无法设置。要获得该值,我必须使用 GetEncryptedId() 或 GetDecryptedId()。
视图模型
public ViewModel
{
public int _id;
public int Id { set { _id = Encrypt(value); }
public Child ChildProperty {get; set; }
}
public Child
{
public int Id {get; set;}
public string Name {get; set; }
}
这里的问题是,出于某种原因,Auto Mapper 需要一个 get 访问器,以便它可以设置一个值。
public ViewModelProfile()
{
CreateMap<Model, ViewModel>().ForMember(vm => vm.Id, opt => opt.MapFrom(m => m.ChildProperty.Id))
}
这会抛出错误并说明:
CS0154 The property or indexer 'Id' cannot be used in this context because it lacks the get accessor.
- 为什么 Auto Mapper 需要“获取访问器”来设置值。
- 是否有强制设置而不获取的配置选项?
作为一种解决方法,我添加了一个Get { return -1; },但这远非理想。
【问题讨论】:
-
我无法回答你的问题,但我提供这个是为了提供帮助:这违反了框架设计指南(Cwalina,Abrams)的第 5.2 节:“不要提供 set-只有属性。如果无法提供属性 getter,则将功能实现为方法。"
-
重构 API 的建议仍然很有价值——只设置属性是个坏主意。使用显式方法设置值,或仅通过构造函数设置值。如果您绝对需要一个属性来满足其他 API 的需求,请为此提供一个适配器。或者只拥有
EncryptedID和UnencryptedID属性;设置一个更新两者。其中任何一个都比O.Id = 5在幕后做一些奇怪的加密要直观得多。 -
谢谢@JeroenMostert 解决了这个问题。将您的 cmets 弹出到答案中,我会将其标记为答案。
-
@Amy,感谢您的提醒。如果使用方法,它会使映射成为一项单调的任务。我需要手动指定每次使用哪种方法。我会熟悉这些指南,因为我以前没有听说过。
标签: c# automapper