我是RavenDB和MVC3的新手,特别是IoC的用法(不是概念)。所以只是为了警告你,这听起来像是一个非常初学的问题。
总结: 我有一个域名模型,让我们说它是
public class Goose
在这个类中,我可能有一个更复杂的对象作为属性
public Beak beak { get; set; }
在RavenDB中,我们正确地鼓励[JsonIgnore]这个属性或根本没有它,而是有一个引用标识符,比如
public String beakId { get; set; }
在我的MVC3应用程序的过程中,我想要查看Goose,我可能想要向用户显示一些关于Goose和它的Beak(应该是Bill?)。所以,我需要一个视图模型吗?
public class GooseModel
{
public String BeakColour { get; set; }
public String BeakLength { get; set; }
...etc
}
是的,假设我有一些GooseRepository和一些BeakRepository,这是一个简单的问题....
我在GooseController类中,我正在加载一个Goose来查看。我在什么时候使用BeakRepository以及谁应该知道它? GooseController知道GooseRepository并且正在通过id加载Goose。此时我们可以在Goose类中有一些属性代表整个Beak,但我真的不想将BeakRepository注入到GooseRepository中吗?好吧,也许当我从Goose创建GooseModel时,我发现我可以获得BeakColour和BeakLength的GooseModel属性,怎么样?好吧我喜欢AutoMapper,所以让我的地图为GooseModel来自Goose正在使用BeakRepository找到Beak,然后提取两个Beak属性来填充GooseModel字段......这也似乎错了......那么还剩下什么? GooseController ..应该是Goose控制器知道BeakRespository然后找到并设置BeakColour和BeakLength!?这当然看起来也完全错了..
那么它在哪里完成?控制器,域对象,映射器或其他地方?也许我应该在Goose视图中使用Type Beak的局部视图?..
答案 0 :(得分:1)
我倾向于将这种逻辑合并到服务/业务层(GooseService
)中,然后我将其注入控制器。您的服务图层可能需要GooseRepository
和BeakRepository
,并返回已将GooseViewModel
映射到一起的已解析对象。
答案 1 :(得分:1)
嗯,...读你的问题我强烈建议你忘记服务层和存储库层。如果你没有充分的理由保留它们(测试不是其中之一,因为RavenDB有一个快速而简单的EmbeddableDocumentStore)拉它们以利用RavenDB的一些非常好的功能。
我实际上写了一篇关于为什么我认为你应该避免这些层的帖子: http://daniellang.net/keep-your-code-simple/这是关于NHibernate的,但概念也适用于此。
是否应将BeakColor和BeakLength属性反规范化为Goose文档取决于您的应用程序需求。如果您对“聚合根”一词感到满意,那么经验法则是这些通常是您的文档。如果您不确定是否应该应用非规范化,请避免使用,并在加载Goose时使用.Include(goose => goose.Beak)
。
如果这对您有意义,请告诉我。