5
我在我的项目中使用服务层的存储库模式。 对于每个视图,我将创建一个视图模型。ASP.NET MVC服务层输入输出数据
什么我困惑的是,应该在服务层直接访问域对象,并将其返回到控制器,或者我应该使用的DTO。如果我应该使用DTO,那么把它们放在项目架构中?
谢谢。
我在我的项目中使用服务层的存储库模式。 对于每个视图,我将创建一个视图模型。ASP.NET MVC服务层输入输出数据
什么我困惑的是,应该在服务层直接访问域对象,并将其返回到控制器,或者我应该使用的DTO。如果我应该使用DTO,那么把它们放在项目架构中?
谢谢。
服务层负责通过实施适当的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; }
}
}
如果我将CoffeeEntity发送给控制器而不是GetCoffeeInDto,我是否违反了体系结构的规则? 在我看来,重写域对象只是为了使用DTO。 – SherleyDev
是的,如果您将实体发送给控制器,则违反了体系结构。但是如果你的项目不大,而且你的业务不够复杂,你就不必使用这种架构。将对象分为Dto和Entity就是区分信息和数据。关于分离关注原则,在数据层中播放数据和在表现层中播放信息被认为是单独的关注点,并且使用单独的类实现来保持。 – mecek
+1优秀的答案。 @SherleyDev看看这里:http://stackoverflow.com/a/21569720/654708获得更详细的答案。请注意,将控制器绑定到域模型本身并不坏;对于较小的项目,创建DTO可能被认为是过度的。 – GFoley83