如何用CheckAvailability字典更新ActionMenuItemModel的IsAvailable字段
问题描述
我有一个返回Dictionary<IItemWithRules, bool>类型的CheckAvailability方法,代码如下:
public Dictionary<IItemWithRules, bool> CheckAvailability(List<IItemWithRules> tiles) { //... }
我希望在GetAvailableMenuActions方法中使用该方法,更新集合中ActionMenuItemModel实例的IsAvailable字段,当前该方法代码如下:
public List<ActionMenuItemModel> GetAvailableMenuActions() { var actions = this.actionMenuItemBllFactory.Create() .GetListBy( a => a.Active, z => z.SelectNested(a => a.AvailabilityRules)); var filteredItems = this.rulesService.FilterItemsWithRules(actions) .OrderBy(a => a.Order) .ToList(); return this.networkAvailabilityService.CheckAvailability(new List<IItemWithRules>(filteredItems)) .Keys.Select(x => new ActionMenuItemModel((ActionMenuItem)x)) .ToList(); }
ActionMenuItemModel类定义如下:
public class ActionMenuItemModel { public ActionMenuItemModel() { } public ActionMenuItemModel(ActionMenuItem domainModel) { this.Id = domainModel.Id; this.Label = domainModel.Label; this.Href = domainModel.Href; this.Target = domainModel.Target; this.Icon = domainModel.Icon?.Content; } public Guid Id { get; init; } public string Label { get; init; } public string Href { get; init; } public string Target { get; init; } public string Icon { get; init; } public bool IsAvailable { get; init; } }
当前返回逻辑仅转换字典的Key生成模型,我需要用CheckAvailability返回的字典值,为模型的IsAvailable字段赋值,请问该如何修改代码实现此需求?
解决方案
由于IsAvailable是init修饰的属性,只能在对象初始化阶段赋值,无法在创建实例后修改,因此需要基于字典的键值对来完成模型的初始化,以下两种方式均可实现需求:
方式一:使用对象初始化器直接赋值
修改GetAvailableMenuActions的返回逻辑,先获取完整的可用性字典,再遍历键值对为模型的IsAvailable赋值:
public List<ActionMenuItemModel> GetAvailableMenuActions() { var actions = this.actionMenuItemBllFactory.Create() .GetListBy( a => a.Active, z => z.SelectNested(a => a.AvailabilityRules)); var filteredItems = this.rulesService.FilterItemsWithRules(actions) .OrderBy(a => a.Order) .ToList(); // 先获取完整的可用性检查结果字典 var availabilityDict = this.networkAvailabilityService.CheckAvailability(new List<IItemWithRules>(filteredItems)); // 遍历键值对,初始化模型时赋值IsAvailable return availabilityDict.Select(kv => new ActionMenuItemModel((ActionMenuItem)kv.Key) { IsAvailable = kv.Value }).ToList(); }
方式二:新增构造函数重载(推荐)
先给ActionMenuItemModel增加一个接收领域模型和可用性状态的构造函数,让赋值逻辑更封装:
public class ActionMenuItemModel { public ActionMenuItemModel() { } public ActionMenuItemModel(ActionMenuItem domainModel) { this.Id = domainModel.Id; this.Label = domainModel.Label; this.Href = domainModel.Href; this.Target = domainModel.Target; this.Icon = domainModel.Icon?.Content; } // 新增构造函数,复用原有构造逻辑并传入可用性状态 public ActionMenuItemModel(ActionMenuItem domainModel, bool isAvailable) : this(domainModel) { this.IsAvailable = isAvailable; } public Guid Id { get; init; } public string Label { get; init; } public string Href { get; init; } public string Target { get; init; } public string Icon { get; init; } public bool IsAvailable { get; init; } }
再修改GetAvailableMenuActions的返回逻辑:
public List<ActionMenuItemModel> GetAvailableMenuActions() { var actions = this.actionMenuItemBllFactory.Create() .GetListBy( a => a.Active, z => z.SelectNested(a => a.AvailabilityRules)); var filteredItems = this.rulesService.FilterItemsWithRules(actions) .OrderBy(a => a.Order) .ToList(); var availabilityDict = this.networkAvailabilityService.CheckAvailability(new List<IItemWithRules>(filteredItems)); // 调用新增的构造函数直接传入可用性状态 return availabilityDict.Select(kv => new ActionMenuItemModel((ActionMenuItem)kv.Key, kv.Value)).ToList(); }
内容的提问来源于stack exchange,提问作者Eugene Sukh
相关产品推荐
相关产品推荐

