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在表示层中的智能感知特性。

n层的实体框架

您可以尝试存储库模式。你首先有一个领域层的对象,将类似于你的实体对象,这个领域层将在它自己的项目/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上下载该框架的用户指南,它包含了关于架构考虑的整个部分。