使用一个简单的例子:
当我想填充网格视图时,需要从业务逻辑中调用一个方法,然后再调用数据访问层的方法。
方法和相关逻辑如下。
数据访问层:
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 []转换为Business Logic Tier的datatable类型,并将数据表传递给Presentation Tier。但是这样做会删除Presentation Tier中EntityFramework的intellisense功能。
答案 0 :(得分:1)
您可以尝试存储库模式。您首先拥有一个与您的Entity对象类似的对象域图层,此域图层将位于其自己的项目/ dll中。您可以使用类似AutoMapper的东西,通过业务层将Entity对象中的值映射到Domain对象。然后表示层将/可以共享域对象层,这样就可以抽象出
后面的实体数据层IRepository<T>
{
IEnumerable<T> GetAll();
T GetById(int id);
void Save(T saveThis);
void Delete(T deleteThis);
}
每个表的类型T都是域类型,在这些方法中,您可以将实体类型映射到域类型。此IRepository可以是您在Data Tier访问时的服务合同。
至于您的其他问题,您对实体对象所做的任何更改都需要反映在域对象中,但这可以通过AutoMapper等方式完成。我认为在大多数情况下,您不希望共享EF或LinqToSql数据类型一直到视图或UI。
由于它是WCF,您可以将域层作为序列化类型。
答案 1 :(得分:0)
您可能有兴趣使用在服务器端使用Entity Framework的开源N-Tier Entity Framework并生成整个基础架构,用于构建基于WCF的n层架构,包括客户端的类似EF的API 。查看可在codeplex上下载的框架用户指南,它包含有关架构考虑的整个部分。