我非常忙于新MVC应用程序的架构,但我对如何管理不同类型的对象感到非常困惑。混淆是关于实体,业务对象和视图模型之间的关系。 我将用一个例子描述我的困惑:
我已经设置了不同项目的Web应用程序:MVC前端,BLL,DAL,常见的东西等。
让我说我有一个自行车列表的视图。我想显示自行车的细节,如颜色,尺寸,制造商。但在我的数据库中,Bike和Manufacturer是两个不同的表,因此在我的Entity Framework上下文中,这些也是两个不同的类。
所以我有两个实体自行车和制造商。但在我的业务需求中,我认为他们需要成为一个单独的对象,我可以在业务逻辑中操作或使用它。然后有我的观点,需要一个(视图)模型。这也应该是具有来自不同表的属性的组合ViewModel。
我该如何处理?我是否需要从我的DAL获取Bike和Manufacturer对象,并在我的BLL中创建一个业务对象,在做了一些业务逻辑之后,我应该在我的控制器中创建一个ViewModel吗?或者我的DAL是否需要返回合并的业务对象?或者我可以将实体对象用作业务类吗?或者我也可以将我的业务对象用作ViewModel?
我希望我的问题很清楚,任何人都可以给我一个很好的建议,告诉我需要哪个对象,以及创建不同类型对象的方式,地点和时间,以及这些类应该在哪个层...... < / p>
答案 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)
嗯,实际上你可以(并且可能应该)打破,但成本至少是:失去了知识分子和/或编组编码。
最后,您的项目至少与大会相关联。一个项目期望来自另一个项目的行为。如果您发布天气数据,您希望您的DAL提供天气数据而不是财务数据,即使应该明智地处理此案例。
至少有一个项目必须公开一个接口/ DTO,另一个必须实现这个接口。
通常而且谦虚地,我试图使业务逻辑独立:可以在不参考任何其他项目的情况下构建业务(请注意:我说的是项目不是图层)。所以我的抽象类或接口在业务或域项目中。原因:最可能发生的变化是GUI技术的变化或持久性技术的变化,所以如果你想与我进行互动,那么就是合同(这里的假朋友)。
因此,网站(或任何GUI)项目引用业务项目和DAL项目,DAL项目引用业务项目。
但是当你停止掌握你的上下文的范围(DbContext,ObjectContext,...)时,邪恶开始了。其他说法试图避免向Razor提供附加物体。