我们使用带有Entity Framework的asp.net mvc作为我们的ORM。
我们的数据库很老,很久以前就建成了。因此缺少外键,我们现在无法添加它。我们需要将不同的模型捆绑到ViewModel中。我们不确定是否应该在差异服务方法或控制器中进行初始模型捆绑。
所以我的问题是你认为最好的设计模式和实践。 捆绑控制器:
public class PlayerController : ApiController
{
private readonly IPlayerService _playerService;
private readonly IItemService _itemService;
public PlayerController(IPlayerService playerService, IItemService itemService)
{
_playerService = playerService;
_itemService = itemService;
}
public UserViewModel Get(int id)
{
var user = playerService.GetUser(id);
var item = itemService.GetItem(id);
var userViewModel = Mapper.Map<UserViewModel(user);
userViewModel.item = Mapper.Map<ItemViewModel(item);
return userViewModel;
}
}
或捆绑服务:
public class PlayerController : ApiController
{
private readonly IPlayerService _playerService;
private readonly IItemService _itemService;
public PlayerController(IPlayerService playerService, IItemService itemService)
{
_playerService = playerService;
_itemService = itemService;
}
public UserViewModel Get(int id)
{
var userWithItem = playerService.GetUserWithItem(id);
return Mapper.Map<UserViewModel(userWithItem);
}
}
获取项目的调用将在“GetUserWithItem”中完成,如下所示:
public User GetUserWithItem(int id)
{
var user = _dbContext.user.Find(id);
user.Item = _dbContext.item.Where(x=>x.userId => id);
return user;
}
这样做的“正确”方法可以提供最大的好处吗?
答案 0 :(得分:1)
第二种方法看起来比第一种方法更整洁。保持控制器尽可能轻。
建议,依赖关系应通过抽象而不是实现公开。您应该通过接口引入抽象,而不是使用PlayerService
和ItemService
的具体类。在构造函数注入中使用IPlayerService
和IItemService
。