ASP.NET MVC 3中的Repository和ViewModel

3

我是一名有用的助手,可以为您翻译文本。

以下是需要翻译的内容:

这是我正在努力解决的情况。我有一个对象模型:

public class MyModel 
{
  public string Prop1 {get; set;}
  public string Prop2 {get; set;}
//etc

}

然后我有对象模型视图。
public class MyModelView
{
  public MyModel MyModelObject;

  public SelectList PropToBeSelected1 {get; set;}
  public SelectList PropTobeSelected2 {get; set;}
 //etc

}

我还有一个MyModelRepository类,负责执行删除和更新等操作。

到目前为止都很好理解清楚。

问题是:PropToBeSelected1和PropTobeSelected2是下拉列表,其内容来自数据库。应该将检索这些内容的方法放在我的MyModelRepository中吗?还是应该为ViewModel创建另一个仓库?

谢谢。

2个回答

1

首先,您真的不想在viewModel中使用类似于域的对象。您的viewModel应该是干净的,只包含基本类型(如字符串、整数等)。因此,我建议使用a AutoMapper将您的两个字符串属性映射到viewModel。

对于选择列表,有很多方法可以解决这个问题,但我可以想象如果它们是属性列表,则它们不是实际实体,而是值对象。在这种情况下,为它们创建一个存储库过度设计,会导致糟糕的设计。

我会将属性列表的“获取”放在MyModelRepository中。例如:

_myModelRepository.getProperties1For(myModel);

然后再次使用AutoMap获取您的选择列表。

编辑: 像@M.Radwan指出的那样,对于复杂的领域模型,我将在视图模型中创建视图模型以便于映射。

领域模型--

public class User : Entity
{
   public Address Address { get; set; }
}
public class Address
{
   public string Street {  get; set; }
   public string Zip { get; set; }
}

将映射到

public class DetailsViewModel
{
  public int Id { get; set; }
  public string Name { get; set; }
  public AddressViewModel Address { get; set; }
  
  public class AddressViewModel
  {
    public string Street { get; set; }
    public string Zip { get; set; } 
  }
}

在我们的经验中,这是为了给您的viewModel添加任何复杂性的唯一原因。虽然我们会将SelectLists放入我们的viewModel中,但最近我们一直在使用内部viewModels的IEnumerables,并调用自定义EditorFor或DisplayFor将它们转换为下拉列表/复选框/单选按钮。


1
我同意@jasonhooten的大部分观点,但并非全部。我总是使用映射层,但如果您的ViewModel很复杂,并且与其他ViewModel复杂度相同,这些ViewModel将传递到主视图中的部分视图中,那也没关系。 - Mohamed.Radwan -MVP
是的,我想我应该澄清一下。在处理复杂的领域模型时,为了方便映射,我会创建多个内部视图模型(这些模型由基元或其他视图模型组成)。我将修改我的答案以展示一个例子。 - jasonhooten
谢谢,你的软件非常有趣。在我们下一次迭代期间,我一定会好好检查它。 - jasonhooten
谢谢,只要记住这是一个测试版,我的目标是获得真正的反馈和贡献者,以便我们可以制作可靠的软件,因为这不仅仅是软件问题,而是敏捷实施方法的问题。把它看作是敏捷执行的工具。 - Mohamed.Radwan -MVP
AutoMapper 过于复杂化了。实际上并没有硬性规定不将领域模型放在 ViewModel 中。这是一个人的选择。如果你仔细想一想,逻辑上讲这是有道理的,因为领域模型毕竟与视图相关。在这里引入 AutoMapper 是不必要的复杂性。 - sarsnake
除此之外,你的回答很有用。 - sarsnake

1
答案是否定的,如果你真的需要它们以这种方式,就不应该为它们创建任何存储库。因此,它们可能是值对象,如@jasonhooten所说,它们应该连接到主聚合对象上,该对象由存储库使用。
最后,我在完成视图并使其正常工作之前不会决定ViewModel结构,这就是我创立DevMagicFake的原因。通过使用DevMagicFake,您将延迟所有有关ViewModel或存储库结构以及如何使用服务层的设计决策,所有这些决策都将被推迟,直到完全完成您的视图并使其正常工作,就像BDD(行为驱动开发)和TDD(测试驱动开发)一样,因此您可以做出正确的设计决策和对象模型本身。
因此,我只创建了以下操作方法。
        public ActionResult List(MyModelView myModelView)
    {
        FakeRepository<MyModelView> repository = new FakeRepository<MyModelView>();
        repository.Add(myModelView);
    }

这个假的存储库将使我能够保存和检索我的整个模型,即使它是一个复杂的模型,直到我完成并先让它正常工作,然后再开始考虑真正的设计和真正的存储库应该是什么样子,并进行调整

有关DevMagicFake和这种方法的更多信息,请参见此链接

CodePlex上的DevMagicFake


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接