【发布时间】:2014-07-05 06:50:54
【问题描述】:
我认为我的应用程序至少应该有以下几层:
- DAL(无通用接口;从数据库获取数据,从另一个 Web 服务获取数据,从文件获取数据)
- 存储库(每个重要/根聚合的 CRUD 接口;实现因源而异)
- 服务(使用存储库接口;实现因业务逻辑而异)
- Web API(包装服务;安装容器;实现因运行时参数/配置而异)
我知道我的 Web API 应该返回 DTO,我将其解释为只有自动实现的公共属性的 C# 对象。
理论上,有时我需要执行BigComplicatedServiceCommand,其中一个工作单元中将涉及多个存储库,但其他时候我的 Web API 还不如直接调用存储库,因为它只是在执行 CRUD。
我有兴趣了解从(通过 web api 模型绑定输入到 web 服务)DTO 到服务需要的任何地方的位置映射,以及应该在哪里进行验证。 p>
粗略地说,我有这个想法:
输入接口
- 接收请求并映射到路线
- 使用模型绑定器按约定绑定到 DTO
- 使用 IoC 容器实例化特定控制器
- 运行特定的控制器操作
- 在控制器操作中,包装对服务层的调用
现在,在第 5 步之后出现问题。我是否将 DTO 发送到服务?然后,我的服务将与我的 DTO 相结合。
我是否为每个服务方法定义了一个特定的接口?如果是这样,这些实际上是它们自己的 DTO,我不妨为每个服务输入排列定义一个 DTO。
假设我的服务采用 DTO,
- 在服务方法中,执行业务逻辑并调用存储库
- 在存储库中,CRUD 的东西
- 将最终结果从服务方法返回给 API
- 转换为 DTO 并从 API 返回到 Internet
现在,我的存储库是否应该严格处理域对象?如果是这样,谁负责选角? (服务?)
最后,考虑到验证,我在想:
- 使用以下方法之一预先验证:
ModelStateActionFilter(在操作执行之前),在转换为服务需要作为输入的任何内容期间。因此,这将确保CreateUserService正在接收具有Username和Password的对象。 - 使用存储库和其他用户名唯一且密码足够强的服务在服务方法中验证
- 在 DAL 级别进行验证以确保 Entity Framework 满意
我的问题是,我应该将 System.DataAnnotations 放在哪些(如果有)对象上?此堆栈中是否有任何类型的模型应负责其自身的验证?
感谢任何哲学帮助。
【问题讨论】:
-
这个问题应该在programmers.stackexchange.com上
标签: c# web-services validation castle-windsor n-tier-architecture