【发布时间】:2023-03-12 13:25:01
【问题描述】:
我正在重新设计解决方案的架构以实现SOA。
在进行了我想出的设计更改后:
- MySolution.Client.MyProject.Web ...... //ASP.NET 网站
- MySolution.Client.MyProject.Proxy .... //服务代理 C# 库项目 *1
- MySolution.Service .................... //Service.svc 的Service.cs 在这里
- MySolution.Service.DataContract ...... //IService.cs for Service.cs 在这里 *[2]
- MySolution.Service.HttpHost .... //Service.svc 在这里
- MySolution.Model ..................... //所有自定义数据类和 EDMX 模型都在这里 *[3]
- MySolution.Repository ...... //Repository 使用 LINQ 和 ADO.NET 查询查询 DB
*1MySolution.Client.MyProject.Proxy: 该项目包含服务代理并包含表示类
*[2]MySolution.Service.DataContract:
- 此项目包含 IService 和请求/响应类
- Service.cs 中的所有方法都将 Request 类作为输入并返回 Response 类作为输出
- 因此,该项目被 2 个客户端项目(Web 和代理)引用,因为它包含 IService 以及与 Service.cs 通信所需的所有请求/响应类
*[3]MySolution.Model: 该项目包含作为实体框架数据模型的 .edmx 以及项目中使用的一些自定义类。
问题:
因为我只使用请求/响应类在服务和客户端之间进行通信,所以 MySolution.Service.DataContract 项目只被 Service.cs 和 Repository.cs 使用
由于存储库生成的所有响应,我必须将它们映射到其各自响应类的属性(这使得原始返回的实体和响应类几乎相同)。但我没问题...
例如:
- Repository.cs 方法中的 GetCustomer() 方法被 Service.cs 调用
- 存储库中的 GetCustomer() 方法执行 LINQ 查询并返回“客户”对象
- Service.cs 然后将“Customer”对象的所有属性映射到“CustomerResponse”对象
- Service.cs 然后将“CustomerResponse”返回给调用者。
在这种情况下,大多数属性将在两个类中重复。如果有解决办法,那就好了,否则,我没问题。
然而,当 Repository.cs 的 GetCustomers() 方法(注意它不是 GetCustomer())被调用时,它会返回一个 Customer 对象的列表,并且为了返回目的而映射它意味着一个“ for 循环”,它迭代集合并进行映射...这不行...
考虑到我不想在没有“CustomerResponse”的情况下返回“Customer”对象,是否有更好的方法,因为首先它违反了 SOA 架构,其次我不希望我的客户项目有任何参考模型或存储库项目?
【问题讨论】:
标签: asp.net wcf visual-studio-2008 entity-framework soa