MVC洋葱架构,一些问题

时间:2015-03-05 15:07:32

标签: c# asp.net-mvc asp.net-web-api n-tier-architecture onion-architecture

我正在使用Asp.net MVC 5,Web Api 2和Entity Framework创建一个项目。我正在使用Onion架构进行设计,因此我有一个DAL,Service和UI层。

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

但我有以下问题:

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

  2. 我正在使用DTO进行webapi操作,如果服务层返回DTO还是映射应该在UI层中完成?

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

1 个答案:

答案 0 :(得分:6)

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

    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);
    }

服务层应该返回您的业务实体,任何用于网络通信/ json格式化的映射都应该在web api中完成。这样可以最大限度地重复使用您的服务。

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

使用C#,EF,Web Api

的洋葱架构https://github.com/carbonrobot/FullStackEF的示例