【发布时间】:2014-10-08 09:49:03
【问题描述】:
我们正在将核心 Web 应用程序重构为 3 层 SOA 架构:
- 演示文稿(asp mvc)
- 服务层(wcf、net.tcp)
- 持久性 (sql)。
大约有 5 个内部网站,每个都有自己的服务层。 服务和 UI 通过 DTO 在彼此之间共享信息。 问题是,大多数服务方法都是专门为 UI 设计的,因此一些服务变得非常庞大,例如:
// CompanyService:
CompanyDTO GetByName(String)
CompanyDTO GetByNameAndCity(String, String)
CompanyDTO GetByNameOrCity(String, String)
CompanyDTO GetByStartsWithNameOrStartsWithCity (String, String)
CompanyDTO GetByNameOrStartsWithCity(String, String)
CompanyDTO GetByNameOrStartsWithCityAndHavingAtLeastOneUser(String, String)
...
CompanyPeopleDTO GetByNameWithPeople(String)
CompanyPeopleDTO GetByNameAndCityWithPeople(String,String)
CompanyPeopleActivityDTO GetByNameWithPeopleAndActivites(String)
...
有时会有一些非常具体的查询,例如:
CompanyAdmin1DTO GetComplexForAdmins1(String, String, String, String, Boolean, Boolean, int) // name,city,country,email, is deleted, is active, founded
CompanyAdmin2DTO GetComplexForAdmins2(String, String, String, Boolean) // name starts with, city starts with, have users
CompanyAdmin3DTO GetComplexForAdmins3(String, String, String, int) // name OR city AND have users
我们最终得到了大量的 fetch 方法,其中实际的逻辑方法正在丢失。 是否有更好的命名约定,甚至是完全不同的方法?(不暴露域/持久性) Web/服务层在物理上是分开的,所以 WCF 是必须的。
【问题讨论】:
-
可能有替代方案,但我知道这些是 façade 方法,也许看起来很乱.. 但归根结底,façades 试图解决使用底层域时的复杂性..
标签: c# .net web-services wcf soa