使用一个简单的例子:实体框架在N层
- 表示层: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 []转换为数据表型在业务逻辑层,并通过数据表到表示层。但是,这样做会删除Presentation Tier中的EntityFramework的智能感知功能。
这对我很有用。我其实不想公开这个实体,而是做一些像你一样的事情。但我不确定是否有办法做到这一点,而不会影响我的开发时间。现在你来谈谈automapper。automapper是否像object.getType()?如果你不介意,你可以根据各种层次向我展示伪或代码吗?使用你的方法,我可以看到iRepository在业务层面上提供的帮助,但是就表现层而言,我应该如何访问T? –
Automapper只是一种将状态从一个对象转移到另一个对象的方式,就像这样。你可以在codeplex上查看它,我使用自己的自制反射映射方案,但Automapper会做得更好。基本上你可以用上面显示的合同将每个表格表示为它自己的wcf存储库服务(尽管你真的不能在WCF中使用通用接口)。 –
然而,您可能会或可能会将在合同/存储库中由T表示的您的域对象共享到表示层,就像您上面使用SampleEntity共享它一直到表示层一样。您的表示层只会了解从IRepository服务返回给您的域对象。它将无法知道实现此合约的服务内部(数据环境和转换到域对象的所有细节)。 –