MVC3,RavenDB,AutoMapper,IoC / DI和Geese - 我应该在哪里使用我的相关存储库?

时间:2011-11-09 20:58:06

标签: asp.net-mvc-3 architecture ravendb

我是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的局部视图?..

2 个答案:

答案 0 :(得分:1)

我倾向于将这种逻辑合并到服务/业务层(GooseService)中,然后我将其注入控制器。您的服务图层可能需要GooseRepositoryBeakRepository,并返回已将GooseViewModel映射到一起的已解析对象。

答案 1 :(得分:1)

嗯,...读你的问题我强烈建议你忘记服务层和存储库层。如果你没有充分的理由保留它们(测试不是其中之一,因为RavenDB有一个快速而简单的EmbeddableDocumentStore)拉它们以利用RavenDB的一些非常好的功能。

我实际上写了一篇关于为什么我认为你应该避免这些层的帖子: http://daniellang.net/keep-your-code-simple/这是关于NHibernate的,但概念也适用于此。

是否应将BeakColor和BeakLength属性反规范化为Goose文档取决于您的应用程序需求。如果您对“聚合根”一词感到满意,那么经验法则是这些通常是您的文档。如果您不确定是否应该应用非规范化,请避免使用,并在加载Goose时使用.Include(goose => goose.Beak)

如果这对您有意义,请告诉我。