2013-11-01 29 views
5

我在我的项目中使用服务层的存储库模式。 对于每个视图,我将创建一个视图模型。ASP.NET MVC服务层输入输出数据

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

谢谢。

回答

9

服务层负责通过实施适当的business logic映射(转换)Dto对象和域对象。

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

DTO的是控制器和服务之间的转移,而另一方面域对象的服务和信息库

控制器之间的转移不知道域和库不知道DTO。服务既知道DTO和域并将它们转换彼此的业务规则像驾驶员和道路之间的车,就像你和我之间的计算器,像一切,抽象...

下面的代码是一个例子。考虑每个命名空间是一个包。

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; } 
    } 
} 
+0

如果我将CoffeeEntity发送给控制器而不是GetCoffeeInDto,我是否违反了体系结构的规则? 在我看来,重写域对象只是为了使用DTO。 – SherleyDev

+0

是的,如果您将实体发送给控制器,则违反了体系结构。但是如果你的项目不大,而且你的业务不够复杂,你就不必使用这种架构。将对象分为Dto和Entity就是区分信息和数据。关于分离关注原则,在数据层中播放数据和在表现层中播放信息被认为是单独的关注点,并且使用单独的类实现来保持。 – mecek

+0

+1优秀的答案。 @SherleyDev看看这里:http://stackoverflow.com/a/21569720/654708获得更详细的答案。请注意,将控制器绑定到域模型本身并不坏;对于较小的项目,创建DTO可能被认为是过度的。 – GFoley83