ASP.NET MVC 服务层输入输出数据

Posted

技术标签:

【中文标题】ASP.NET MVC 服务层输入输出数据【英文标题】:ASP.NET MVC service layer input output data 【发布时间】:2013-11-13 05:58:42 【问题描述】:

我在我的项目中使用服务层遵循存储库模式。 我将为每个视图创建一个视图模型。

我感到困惑的是,服务层应该直接访问域对象并将它们返回给控制器,还是应该使用 DTO。如果我应该使用 DTO,应该将它们放在项目架构中的什么位置?

谢谢。

【问题讨论】:

【参考方案1】:

服务层负责通过实现正确的business logic来映射(转换)Dto对象和Domain对象。

您的 DTO 对象应在控制器和服务中使用。

DTO 在 Controller 和 Service 之间传输,而 Domain 对象在 Service 和 Repository 之间传输

Controller 不知道 Domain,Repository 不知道 DTO。 Service 知道 DTO 和 Domain,并使用业务规则将它们相互转换,例如司机和道路之间的汽车,就像你我之间的 ***,就像一切,抽象......

以下代码是一个示例。考虑每个命名空间都是一个包。

namespace Controllers

    using Services;
    using DataTransferObjects;

    public class CoffeeController
    
        public ICoffeeService CoffeeService  get; set; 

        public JsonResult GetCoffee(GetCoffeeInDto inDto)
        
            var result = CoffeeService.GetCoffee(inDto);
            return JsonResult(result);
        

        public JsonResult SaveCoffee(SaveCoffeeInDto inDto)
        
            var outDto = CoffeeService.SaveCoffee(inDto);
            return JsonResult(outDto);
        
    


namespace Services

    using DataTransferObjects;
    public interface ICoffeeService
    
        GetCoffeeOutDto GetCoffee(GetCoffeeInDto inDto);
        SaveCoffeeOutDto SaveCoffee(SaveCoffeeInDto inDto);
    


namespace Services.Impl

    using Services;
    using Repository;
    using DataTransferObjects;
    using Domain;

    public class CoffeeService : ICoffeeService
    
        public ICoffeeRepository CoffeeRepository  get; set; 
        public GetCoffeeOutDto GetCoffee(GetCoffeeInDto inDto)
        
            var entity = CoffeeRepository.Get(inDto.Id);
            return new GetCoffeeOutDto Id = entity.Id, Name = entity.Name;
        

        public SaveCoffeeOutDto SaveCoffee(SaveCoffeeInDto inDto)
        
            var entity = new CoffeeEntity Name = inDto.Name;
            CoffeeRepository.Save(entity);
            return new SaveCoffeeOutDto Id = entity.Id;
        
    


namespace Repository

    using Domain;
    public interface ICoffeeRepository
    
        CoffeeEntity Get(int id);
        void Save(CoffeeEntity coffeeEntity);
    


namespace Repository.Impl

    using Repository;
    using Domain;

    public class CoffeeRepository:ICoffeeRepository
    
        public CoffeeEntity Get(int id)
        
            //get entity from db
            throw new System.NotImplementedException();
        

        public void Save(CoffeeEntity coffeeEntity)
        
            //insert entity into db
            throw new System.NotImplementedException();
        
    


namespace DataTransferObjects

    public class SaveCoffeeInDto
    
        public string Name  get; set; 
    

    public class SaveCoffeeOutDto
    
        public int Id  get; set; 
    

    public class GetCoffeeInDto
    
        public int Id  get; set; 
    

    public class GetCoffeeOutDto
    
        public int Id  get; set; 
        public string Name  get; set; 
    


namespace Domain

    public class CoffeeEntity
    
        public int Id  get; set; 
        public string Name  get; set; 
    

【讨论】:

如果我将 CoffeeEntity 发送到控制器而不是 GetCoffeeInDto,我是否违反了架构规则?在我看来,重写域对象只是为了利用 DTO。 是的,如果你向控制器发送一个实体,你就违反了架构。但是你不必使用这种架构,如果你的项目不大,业务不够复杂的话。将对象分离为 Dto 和 Entity 是关于信息和数据之间的区别。关于关注点分离原则,在数据层玩数据和在表示层玩信息被认为是单独的关注点,并使用单独的类实现来保持。 +1 很好的答案。 @SherleyDev 看看这里:***.com/a/21569720/654708 以获得更详细的答案。请注意,将控制器绑定到域模型本身并不是坏事;对于较小的项目,创建 DTO 可能被认为是矫枉过正。

以上是关于ASP.NET MVC 服务层输入输出数据的主要内容,如果未能解决你的问题,请参考以下文章

关于Asp.net mvc的诡异问题

ASP.NET MVC - 服务层 - 业务层 - 数据层 (EF) - SQL DB :: 数据传输?

在 MVC Controller 中,不依靠定制路由,随心所欲地拦截请求和处理请求,想怎么输入输出都

显示从 ASP.NET MVC 中的命令行进程获取的数据

服务层和 ASP.NET MVC 2 的用途

将控制台应用程序的标准输出流式传输到 ASP.NET MVC 视图