Kar*_*hik 5 architecture asp.net-mvc entity-framework n-tier-architecture
我计划使用ASP.NET MVC作为UI层创建3层应用程序,将WCF作为业务层,使用SQL DB作为数据库.
我的业务层将分为服务层(WCF),业务层(业务逻辑,业务模型),数据层(实体框架 - 数据库优先).
数据层将使用实体框架的实体实现存储库方法,如Get,GetById,Update,Insert.
业务层由业务规则及其模型组成.(这是在POCO).
服务层只是将业务功能公开为可能的服务方法.
MVC中的"M"只是表示模型 - 由Controller使用,以将其转换为JSON/XML并将其提供给View或直接由View使用.
虽然上面提到的方法很常见,但我仍然希望确认这是一个好的设计吗?
我真正的问题是关于层之间的数据传输(UI(MVC) - 服务(WCF) - 业务 - 数据层)
假设我已启动GET操作以从数据库中检索帐户及其特征.在数据库中,它表示为两个不同的表.
在Datalayer中,我想编写一个方法来
使用EF 获取给定AccountNumber的这两个表记录.
我的商业模式有两个名为Account和AccountTraits的类.AccountTraits的对象集合聚合到Account类中.
喜欢,
public class Account
{
string AccountNumber;
List<AccountTraits> Traits;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想用这些数据填充这些Domain对象,我可以在我的数据层中使用类似下面的EF查询.
public IEnumerable<Account> GetAccountAndItsTraits(string AccountNumber)
{
var query = from a in db.Accounts
select new Accounts() {
AccountName = a.AccountName,
Traits = from t in a.AccountTraits
....
return query;
}
Run Code Online (Sandbox Code Playgroud)
这是从数据层(EF)填充商业模式POCO的仪式方法吗?
现在,在应用了一些业务逻辑之后,我想将这些集合返回给UI.如何将这些传输到服务层,如何将其提供给UI模型?
我是否应该在WCF中使用确切的类定义作为业务模型定义DataContract,然后将"复制数据"并将其提供给UI?然后UI应该从WCF代理对象获取数据并"复制到它的表示模型"(它应该有自己的帐户和帐户传输 - 可能有一些额外的字段)?
如果你能对这些主题有所了解,那将是很棒的.
谢谢!
我绝对不会纯粹基于架构来使用 WCF,除非您特别需要它提供的功能。即支持某些企业对企业需求的某些传输/协议。MVC 现在有 WebAPI,它基本上是从 WCF 迁移的相同内容,并且更容易使用,并且可以满足您的架构需求,而不那么令人头疼。
此外,我什至不会使用 WebAPI,除非我公开了一些我确信会在我的应用程序之外使用的东西。如果此服务层仅由此 MVC 应用程序使用,那么我将取消它。您仍然可以拥有业务层+数据层并在没有它的情况下保持关注点分离。这只是我个人的看法。
通常我使用视图模型,它们是为视图定制的模型。它们允许我独立重构视图或数据库,并且只需更改数据转换代码。即数据库字段更改可能只需要在查询中进行调整,并且 ViewModel 保持不变,因此使用该视图模型的所有视图保持不变。与查询实体并将其转换为视图模型的方式几乎相同,new Account除了我将我的 AccountVM 命名为视图模型(专门用于视图的模型)
我个人从我的控制器调用这些类型的数据查询/转换方法。然后,控制器将 AccountVM 或集合传递给其中View(vm)vm 是保存 AccountVM 或集合的变量的名称。
这就是我从数据库获取数据到视图的方式。不管怎样,EF 实体类和 VM 类通常非常相似,有时甚至是相同的。我觉得中间业务实体类与其中一个或另一个太相似,以至于无法真正保证额外的类和额外的复制。
因此,我认为回答您的几个问题: 1 是的,基本上我认为这是一个很好的方法。
2 这个GetAccountAndItsTraits是从控制器调用的,视图是基于你的业务poco(或者我所说的ViewModel)。因此,业务层的回报符合您的模型的预期。我这里不会有服务层。但是,我可能会使用一些专门用于将 EF 实体转换为视图模型的方法,这将在调用业务模型函数之后发生。换句话说,业务模型将返回 EF 实体,然后映射函数会将这些实体映射到这种情况下所需的任何视图模型,因为您可能有许多使用相同业务方法的视图模型和视图。我使用 EF Code First,所以我的实体类已经非常接近 POCO,因此它们泄漏到其他层并不会冒犯我。
| 归档时间: |
|
| 查看次数: |
3170 次 |
| 最近记录: |