在我的项目中,我有一个服务层,它从控制器接收一个对象,将其转换为DTO并将其发送到存储库。 我想问的是,对于我项目中的每个实体类,我都需要一个具有完全相同的实体属性的DTO。 让我展示一些代码:
public class PersonDto
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
};
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
};
public class PersonController : Controller
{
public ActionResult Create(CreatePersonViewModel createPersonViewModel)
{
var personDto = //here I map createPersonViewModel to a PersonDto
_personCreateService.Create(personDto);
}
}
public class PersonCreateService
{
public void Create(PersonDto personDto)
{
_repository.Create(personDto);
}
}
public class PersonRepository
{
public void Create(PersonDto personDto)
{
Person person = PersonMapper.Map(personDto);
_db.Person.Add(person);
}
}
所以,我对此有一些疑问:
答案 0 :(得分:1)
我会尝试回答一些问题。
1 - 这是一个很好的架构吗?
也许。如果您正在使用诸如NHibernate,Entity Framework之类的ORM工具,您必须认为您无法从ORM工具共享您的瞬态对象,因为有时您有代理,而不是混凝土类型。我不喜欢直接从ORM工具发送到视图对象。我更喜欢使用viewModel或DTO。
2 - 我应该将dto映射到服务中的实体还是仅存储在存储库中?
也许,服务应该返回ViewModel
,因为View需要,但有时您需要直接在Query
上指定结果并从Repository
获取结果。
3 - 让我的dto等于我的实体有什么问题吗?
不,有时您可以拥有一个包含50个属性的实体,并且您需要在仅具有5或6个属性的View上显示网格,因此,您必须创建具有这5或6个属性的ViewModel并转换您的实体到ViewModel类型。
有一个名为AutoMapper的好工具可以帮助您映射对象。你应该考虑使用它。
Jimmy Bogard与Asp.Net MVC和AutoMapper有一个很好的实现,关于如何清理帖子和使用ViewModel获取使用asp.net mvc的面向对象编程的最佳实践。
http://lostechies.com/jimmybogard/2011/06/22/cleaning-up-posts-in-asp-net-mvc/