MVC洋葱架构,一些问题

Esc*_*ar5 4 c# asp.net-mvc n-tier-architecture onion-architecture asp.net-web-api

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

我的DAL层包含UnitOfWork和Repositories,我的Service层包含业务案例的服务.

但我有以下问题:

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

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

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

Cha*_*own 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

洋葱架构的一个例子https://github.com/carbonrobot/FullStackEF使用C#,EF,Web Api

  • 所以我可以尝试一下...捕获所有方法并返回标准格式的响应对象.它使来自WebApi等客户端的调用更加清晰,您可以使用常用方法处理响应.在那个尝试... catch也可以记录.由于所有操作都在该方法内发生,因此将捕获,记录和处理所有错误. (2认同)