0

我有我的IndexViewModelwhich 将(当前)一个字段发送到视图

  • List<StaffMemberViewModel> StaffMembers

仅包含工作人员的StaffMemberViewModel全名以及他们的 CorporateTitle。

所有员工数据都包含在 JSON 文件中(但也可以很容易地保存在数据库中)。

这是我目前正在构建的方式IndexViewModel

   public class IndexViewModel : LayoutViewModel
    {
        public IndexViewModel()
        {
            // initialize _staffMembers
            _staffMembers = new List<StaffMemberViewModel>();

            var staffModel = new JsonFileReader()
                .GetModelFromFile<List<Staff>>
                (@"~/App_Data/Staff.json");

            foreach (var member in staffModel)
            {
                _staffMembers.Add(new StaffMemberViewModel
                {
                    FullName = string.Format("{0} {1} {2}", member.FirstName, member.MiddleInitial, member.LastName),
                    CorporateTitle = member.CorporateTitle
                });
            }
        }

        private readonly List<StaffMemberViewModel> _staffMembers;
        public List<StaffMemberViewModel> StaffMembers {get {return _staffMembers;}}
    }

    public class StaffMemberViewModel
    {
        public string FullName { get; set; }
        public string CorporateTitle { get; set; }
    }

然后在控制器中我只使用这样的东西。

[HttpGet]
public ActionResult Index()
{
    var viewModel = new IndexViewModel;
    return View(viewModel);
}

如果我希望我的代码遵循SOLID原则,我该如何更好地连接它?请记住,控制器应该很薄,因此我不想通过调用 json 文件来使控制器膨胀。我应该创建一个服务来填充StaffMemberViewModel


我还应该注意:IndexViewModel 继承自LayoutViewModel包含页面标题和其他可重用属性等内容的抽象。为简洁起见,我没有展示它。我还将向 IndexViewModel 添加更多属性,因此通过删除 IndexViewModel 层并直接进入该层来解决这个问题StaffMemberViewModel不是一个有效的解决方案。

4

1 回答 1

1

看起来 StaffMemberViewModel 实际上是一个模型?这是您的 ViewModel 试图显示的模型。至于连接它,我会做一些整理和依赖注入,以及创建一个映射器工厂:

public class IndexViewModel : LayoutViewModel
{
    public IndexViewModel(IEnumerable<StaffModel> staffModel)
    {
        _staffMembers = StaffModelMapperFactory.Map(staffModel);
    }

    private readonly List<PartialStaffViewModel> _staffMembers;
    public List<PartialStaffViewModel> StaffMembers {get {return _staffMembers;}}
}
public class PartialStaffViewModel
{
    public string FullName { get; set; }
    public string CorporateTitle { get; set; }
}
public class StaffModelMapperFactory
{
    public static List<PartialStaffViewModel> Map(IEnumerable<StaffModel> staff)
    {
        return staff.Select(member => new PartialStaffViewModel
            {
                FullName = string.Format("{0} {1} {2}", member.FirstName, member.MiddleInitial, member.LastName), 
                CorporateTitle = member.CorporateTitle
            }).ToList();
    }
}
[HttpGet]
public ActionResult Index()
{
    var staffModel = new JsonFileService().ReadFileToModel<List<StaffModel>>(@"~/App_Data/Staff.json");

    var model = new IndexViewModel(staffModel)
        {
            Title = "Future State Mobile"
        };

    return View(model);
}
于 2013-09-19T16:24:45.930 回答