所以MVC分为
我认为在准备了很多页之后我已经掌握了每个层的作用,但是我仍然对一个区域感到困惑,这就是模型或控制器中应该有的东西。
我知道数据存储类应该在Controller中 我知道UI修饰符(即拉动正确的模型)应该放在Controller中
但是模型修饰符呢?因此,例如,如果我们采取软件购物车方法,让我们说有人点击结帐按钮,填写他们的付款细节和所有批准,回复恰好处理这个。
回发对象需要
通常(在非MVC上)方法我会创建一个类来处理软件表的Access生成,该表将调用EF来存储信息。我会有一个二级类发送通知和第三类来记录信息。
我是否还应该在MVC中使用这些类,如果是这样,它们会成为控制器或模型的类吗?
答案 0 :(得分:4)
您在上面定义的所有三个要点都构成了您的应用程序模型的一部分;控制器应该只处理模型和呈现给用户的UI表示(视图)之间的编排。
坚持SOLID原则,绝对会同意我们(至少)处理三个独立的组件:
您可以通过多种方式组织架构和组件来执行此操作。一种方法是使应用程序特定的组件/服务依赖于这三个组件并使用它们来执行列出的操作。然后控制器仅依赖于此组件。
答案 1 :(得分:3)
要更详细地展开Russ' great answer,请考虑以下事项:
public class CheckoutController
{
private readonly ICommandHandler<CheckoutCommand> _checkoutHandler;
public CheckoutController(ICommandHandler<CheckoutCommand> checkoutHandler)
{
_checkoutHandler = checkoutHandler;
}
[HttpPost]
public virtual ActionResult Post(CheckoutViewModel viewModel)
{
if (!ModelState.IsValid) return View(viewModel);
var command = Mapper.Map<CheckoutCommand>(viewModel);
_checkoutHandler.Handle(command);
return RedirectToAction("Complete");
}
public virtual ActionResult Complete()
{
return View();
}
}
控制器根本没有做任何事情。它为用户提供控制流程。现在,请考虑将此依赖项注入控制器:
public class DomainCheckoutCommandHandler : ICommandHandler<CheckoutCommand>
{
private readonly IEntityDataStorage _repos;
private readonly IEmailSender _email;
private readonly ILogger _log;
public DomainCheckoutCommandHandler(IEntityDataStorage repos,
IEmailSender email, ILogger log)
{
_repos = repos;
_email = email;
_log = log;
}
public void Handle(CheckoutCommand command)
{
// use _repos to Add an entry to a database table
// use _email to issue the receipt
// use _log to log the purchase
}
}
在these three posts中有关于使用interface + DI的一些很好的信息。
最好的部分是你可以将所有其他代码 - 接口,域类和其他接口实现 - 完全移出MVC项目之外。这样,MVC项目中没有任何东西可以做任何事情。它只委托由业务层或其他类库实现的接口。