C# 设计模式:在控制器或服务中捆绑模型
我们使用asp.NETMVC和实体框架作为我们的ORM 我们的数据库非常古老,而且是很久以前建立的。外键丢失,我们现在无法添加。我们需要将不同的模型捆绑到ViewModels中。我们不确定是应该在不同的服务方法中还是在控制器中进行初始模型绑定 所以我的问题是你认为什么样的设计模式和实践是最好的。 捆绑控制器:C# 设计模式:在控制器或服务中捆绑模型,c#,asp.net,asp.net-mvc,design-patterns,C#,Asp.net,Asp.net Mvc,Design Patterns,我们使用asp.NETMVC和实体框架作为我们的ORM 我们的数据库非常古老,而且是很久以前建立的。外键丢失,我们现在无法添加。我们需要将不同的模型捆绑到ViewModels中。我们不确定是应该在不同的服务方法中还是在控制器中进行初始模型绑定 所以我的问题是你认为什么样的设计模式和实践是最好的。 捆绑控制器: public class PlayerController : ApiController { private readonly IPlayerService _player
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;
}
}
哪一种“正确”的方法能提供最大的好处?第二种方法看起来不错,比第一种方法好得多。使控制器尽可能轻
建议通过抽象而不是实现公开依赖关系。您应该通过接口引入抽象,而不是使用具体的
PlayerService
和ItemService
类。在构造函数注入中使用IPlayerService
和IItemService
。未知数太多,无法知道哪个是“正确的”。我使用的快速经验法则…您是否需要在多个控制器中使用给定的视图模型?如果是这样的话,我会倾向于在服务层做繁重的工作。如果一个控制器中只需要视图模型,我会倾向于在控制器中完成工作。也就是说,我倾向于使用非常薄的控制器。我不喜欢把代码埋在难以重用和测试的地方。我更喜欢尽可能精简控制器。在这种情况下,我甚至会将UserViewModel Get(int-id)
方法从控制器移动到服务层或特殊的UI层。我更喜欢每个操作方法有一个服务调用,并将其留给服务层(以及更高的层)来将数据表述为适当的模型。当我有所不同时,只有当它是真正特定于UI的东西时,它才会出现在模型件上,例如SelectList
items。在这种情况下,服务将传递数据(一次调用),控制器可以执行额外的工作,将其转换为与视图相关的适当格式。@IlyaChumakov一般来说,我认为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 userWithItem = playerService.GetUserWithItem(id);
return Mapper.Map<UserViewModel(userWithItem);
}
}
public User GetUserWithItem(int id)
{
var user = _dbContext.user.Find(id);
user.Item = _dbContext.item.Where(x=>x.userId => id);
return user;
}