2011-11-14 62 views
3

以下是我正在努力的情况。 我有一个对象模型:asp.net中的版本库和ViewModel mvc 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类以及这确实为为MyModel删除,更新操作。

目前为止都很好,清楚。

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

谢谢。

回答

1

首先你真的不想在你的viewModel中使用domian-ish对象。你的viewModel应该只有原语(比如字符串,整数等)是干净的。所以我建议使用a AutoMapper将你的两个字符串道具映射到你的viewModel。

对于选择列表,有很多方法可以解决这个问题,但我可以想象如果它们是属性列表,那么它们不是实际的实体,而是值对象。在这种情况下,为他们创建存储库已经超过了杀戮和寄宿者的糟糕设计。

我会把你的MyModelRepository中的'获取'属性列表。类似于

_myModelRepository.getProperties1For(myModel); 

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

编辑: 像@ M.Radwan指出,复杂的领域模型,我会做viewModels insdie viewModels为便于映射。

域名型号 -

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; } 
    } 
} 

这在我们的经验是任何复杂性添加到您的视图模型的唯一原因。我们将SelectLists放入viewModel中,但最近我们一直在使用IEnumerables的内部视图模型,并调用自定义的EditorFor或DisplayFor将它们变成下拉列表/复选框/单选按钮列表。

+1

我@jasonhooten他的大部分观点的认同,但不是所有的,我总是用映射图层,但是如果是y就可以我们的ViewModel很复杂,但与另一个ViewModel复杂,将被传递到主视图中的部分视图 –

+0

是的,我想我应该澄清这一点。多次使用复杂的域模型,为了便于映射,我将创建多个内部视图模型(它们由基元或其他视图模型组成)。 我会修改我的答案来显示一个例子。 – jasonhooten

+0

很好的努力,:-) –

1

答案是否定的,如果你真的需要这个观点,你不应该为他们建立任何资料库。因此它们可能是@jasonhooten所说的值对象,它们应该连接到存储库使用的主聚合对象

最后,我不决定ViewModel结构,直到我完成视图并使其首先工作,我创建并创建DevMagicFake,通过使用DevMagicFake,您将延迟设计中关于ViewModel或存储库结构的所有决策,或者您将如何使用服务层,所有这些都将在全面完成视图并使其首次运行之后延迟BDD(行为驱动开发)和TDD(测试驱动开发),所以你可以做出正确的设计决策和对象模型本身

因此,我只是创建操作方法如下

 public ActionResult List(MyModelView myModelView) 
    { 
     FakeRepository<MyModelView> repository = new FakeRepository<MyModelView>(); 
     repository.Add(myModelView); 
    } 

这个假仓库,使我保存和检索我的整个模式,即使它是一个复杂的模型,直到我完成和完成整个视图,使之第一份工作,然后我开始感谢如何在实际设计和真正的版本库应该的样子,并做

有关DevMagicFake更多信息,而这种做法看这个链接

DevMagicFake on CodePlex