ASP.NET MVC实体,DTO,业务对象,ViewModels?我该如何管理?

时间:2014-05-28 06:06:09

标签: c# asp.net-mvc entity-framework architecture

我非常忙于新MVC应用程序的架构,但我对如何管理不同类型的对象感到非常困惑。混淆是关于实体,业务对象和视图模型之间的关系。 我将用一个例子描述我的困惑:

我已经设置了不同项目的Web应用程序:MVC前端,BLL,DAL,常见的东西等。

让我说我有一个自行车列表的视图。我想显示自行车的细节,如颜色,尺寸,制造商。但在我的数据库中,Bike和Manufacturer是两个不同的表,因此在我的Entity Framework上下文中,这些也是两个不同的类。

所以我有两个实体自行车和制造商。但在我的业务需求中,我认为他们需要成为一个单独的对象,我可以在业务逻辑中操作或使用它。然后有我的观点,需要一个(视图)模型。这也应该是具有来自不同表的属性的组合ViewModel。

我该如何处理?我是否需要从我的DAL获取Bike和Manufacturer对象,并在我的BLL中创建一个业务对象,在做了一些业务逻辑之后,我应该在我的控制器中创建一个ViewModel吗?或者我的DAL是否需要返回合并的业务对象?或者我可以将实体对象用作业务类吗?或者我也可以将我的业务对象用作ViewModel?

我希望我的问题很清楚,任何人都可以给我一个很好的建议,告诉我需要哪个对象,以及创建不同类型对象的方式,地点和时间,以及这些类应该在哪个层...... < / p>

5 个答案:

答案 0 :(得分:1)

您可以拥有自定义业务实体,这些实体将在您的视图中引用。

在您的业务实现中,您可以使用一些映射器将您的Entity Framework实体映射到您的自定义业务实体,您可以使用 Automapper实现这一目标。

我希望这会有所帮助。

答案 1 :(得分:1)

您的问题的答案很简单。您的不同模型层之间存在 NO 关系。它们是完全孤立的,不互相引用。一点也不。因此,没有什么可以混淆的。

您的图层的不同部分中的代码可以在两个图层UI-&gt;商业和商务 - &gt;数据之间进行映射,但这应该是它们之间任何交互的程度。

答案 2 :(得分:1)

您应该拥有一些常用功能,您可以获得业务和EF实体的所有映射。

在您的实施中,您只需要求您的映射器提供实际实体。

应该有一些可以为你创建映射的公共类。

像这样的东西

public static void CreateTestMapping() { Mapper.CreateMap<DataAccess.Entities.Test, Business.Entities>() .ForMember(s => s.Col1, d => d.MapFrom(t => t.Colabc)) .ForMember(s => s.Col2, d => d.MapFrom(t => t.ReferenceTable.RefTableCol1)); }

在您的业务实现中,您将使用此映射将Business.Entities转换为EF.Entities,反之亦然

Mapper.Map<Business.Entities.Test, EF.Entities.Test>(source, destination);

答案 3 :(得分:1)

我要做的是:

您的DAL会返回List<Bike>List<Manufacturer>

然后你的业务层应该操纵这些并返回到asp.net MVC一个合适的对象。

例如List<Manufacturer>,每个项目包含List<Bike>

创建适当的ViewModel并添加Controller逻辑来操作它们但是不要在那里进行任何核心业务操作,只需要UI操作以适合您的视图。

另外,我建议不要将您的UI与DAL绑定。

让您的UI项目引用公共库+业务层项目。

让业务与DAL沟通。

答案 4 :(得分:0)

恕我直言,混淆的一部分来自你&#34; can&#39;#34;打破你的项目之间的所有链接,即使你想要&#34; design&#34;和分离关注的原因。

嗯,实际上你可以(并且可能应该)打破,但成本至少是:失去了知识分子和/或编组编码。

最后,您的项目至少与大会相关联。一个项目期望来自另一个项目的行为。如果您发布天气数据,您希望您的DAL提供天气数据而不是财务数据,即使应该明智地处理此案例。

至少有一个项目必须公开一个接口/ DTO,另一个必须实现这个接口。

通常而且谦虚地,我试图使业务逻辑独立:可以在不参考任何其他项目的情况下构建业务(请注意:我说的是项目不是图层)。所以我的抽象类或接口在业务或域项目中。原因:最可能发生的变化是GUI技术的变化或持久性技术的变化,所以如果你想与我进行互动,那么就是合同(这里的假朋友)。

因此,网站(或任何GUI)项目引用业务项目和DAL项目,DAL项目引用业务项目。

  • 控制器从DAL获取数据并将其提供给域/业务逻辑
  • 控制器然后将未附加的结果提供给剃刀,和/或通过DAL保存结果。

但是当你停止掌握你的上下文的范围(DbContext,ObjectContext,...)时,邪恶开始了。其他说法试图避免向Razor提供附加物体。