n层的实体框架
本文关键字:框架 实体 | 更新日期: 2023-09-27 18:03:13
用一个简单的例子:
- 表示层:aspx和后面的代码。
- 业务层:WCF with相关逻辑
- 数据访问层:带有实体框架的WCF
当我想填充网格视图时,将需要调用业务逻辑的方法,该方法反过来调用数据访问层的方法。
方法和相关逻辑如下:
Data Access Tier:
public SampleEntity[] LoadSampleEntity()
{
//retrieve SampleEntity from database.
}
业务逻辑层:
public SampleEntity[] GetSampleEntity()
{
//call the proxy to access Data Access Tier
//Call LoadSampleEntity()
}
表示层:
protected void btn_OnClick()
{
//call the proxy to access Business Logic Tier
//Call GetSampleEntity()
//SampleEntity[] sampleEntity=BusinessLogic.GetSampleEntity();
//gridview.datasouce = sampleEntity
//gridview.databind();
}
给定此结构,如果修改了SampleEntity,则所有3层都需要重新编译。
当新的属性/列添加到SampleEntity时,是否有办法减少重新编译的需要?
我研究过的一种方法是在业务逻辑层将SampleEntity[]转换为数据表类型,并将数据表传递给表示层。但是,这样做会删除EntityFramework在表示层中的智能感知特性。
您可以尝试存储库模式。你首先有一个领域层的对象,将类似于你的实体对象,这个领域层将在它自己的项目/dll。您可以使用类似于AutoMapper的东西,通过业务层将值从Entity对象映射到Domain对象。然后表示层将/可以共享领域对象层,这样你就可以在
后面抽象实体数据层IRepository<T>
{
IEnumerable<T> GetAll();
T GetById(int id);
void Save(T saveThis);
void Delete(T deleteThis);
}
每个表的类型T将是域类型,在这些方法中,您将把Entity类型映射到域类型。这个IRepository可以作为你对Data Tier访问的服务契约。
至于你的其他问题,你对实体对象所做的任何改变都需要反映在域对象中,但这可以用AutoMapper这样的东西来完成。我认为在大多数情况下,你不希望一直共享EF或LinqToSql数据类型到视图或UI。
既然是WCF,你可以让域层成为你的序列化类型
您可能对使用开源的n层实体框架感兴趣,它在服务器端使用实体框架,并生成基于WCF构建n层架构的整个基础设施,包括客户端类似ef的API。可以在codeplex上下载该框架的用户指南,它包含了关于架构考虑的整个部分。