n层中的实体框架

时间:2011-07-21 02:09:26

标签: c# wcf entity-framework n-tier-architecture

使用一个简单的例子:

  • 演示层:aspx和代码隐藏。
  • 业务层:WCF与 相关逻辑
  • 数据访问层:具有实体框架的WCF

当我想填充网格视图时,需要从业务逻辑中调用一个方法,然后再调用数据访问层的方法。

方法和相关逻辑如下。

数据访问层:

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功能。

2 个答案:

答案 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上下载的框架用户指南,它包含有关架构考虑的整个部分。