MVC Onion 架构,一些问题

MVC Onion architecture, some questions

我正在使用 Asp.net MVC 5、Web Api 2 和 Entity Framework 创建一个项目。我正在用洋葱架构设计它,所以我有 DAL、服务和 UI 层。

我的 DAL 层包含一个 UnitOfWork 和存储库,我的服务层包含业务案例服务。

但我有以下问题:

  1. 我在哪里使用工作单元保存(或提交)方法?在服务层还是在UI层? 如果我在服务层使用它,我如何处理跨越多个服务的情况?

  2. 我正在使用 DTO 进行 webapi 操作,服务层 return DTO 或映射应该在 UI 层完成吗?

  3. DTO应该在一个单独的项目中还是在UI项目中?如果它们在一个单独的项目中,我应该使用 MVC 属性进行验证吗?

您的工作单元应该存在于您的服务层中。对服务的每次调用都包含单个工作单元内的业务事务。

    public ServiceResponse<Patient> Save(Patient patient, string userName)
    {
        Func<Patient> func = delegate
        {
            Authorize(patient, userName);
            Validate(patient, new PatientValidator());

            using (var context = _contextFactory())
            {
                return context.Save(patient, userName);
            }
        };
        return this.Execute(func);
    }

服务层应该 return 您的业务实体,任何以网络 communication/json 格式化为目的的映射都应该在 Web api 中完成。这允许最大程度地重用您的服务。

如果 DTO 指的是您在 wire/json 序列化中使用的对象,那么它们应该与 Web Api 保持在同一个项目中。这可能是也可能不是您拥有 UI 的同一个项目。如果您使用 Web Api,我建议使用像 FluentValidation 这样的验证库。

使用 C#、EF、Web 的 Onion 架构示例 https://github.com/carbonrobot/FullStackEF Api