设计模式:在控制器或服务中捆绑模型

时间:2015-10-02 15:52:17

标签: c# asp.net asp.net-mvc design-patterns

我们使用带有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;
}

这样做的“正确”方法可以提供最大的好处吗?

1 个答案:

答案 0 :(得分:1)

第二种方法看起来比第一种方法更整洁。保持控制器尽可能轻。

建议,依赖关系应通过抽象而不是实现公开。您应该通过接口引入抽象,而不是使用PlayerServiceItemService的具体类。在构造函数注入中使用IPlayerServiceIItemService