繁体   English   中英

C#MVC.Net控制器简化

[英]C# MVC.Net Controller Simplification

我试图避免出现“胖控制器”的情况。

控制器调用一个API的例子很多,但是如果您的控制器需要调用两个或多个API怎么办?

您如何简化这种情况? 似乎应该有一种更清洁的方法:

private ServiceTwo serviceTwo = new ServiceTwo();
private MailService mailService = new MailService();

[HttpPost]
public async Task<ActionResult> Index(Customer formData) 
{
    if (!ModelState.IsValid) 
    {
        return View();
    }

    var apiOneService = new ApiOneService(formData);

    if (apiOneService.ExistingUserCheck()) 
    {
        ModelState.AddModelError("Email", "* Email address already exists.");
        return View(formData);
    }

    var apiTwoResult = serviceTwo.CreateTrial(formData);

    var emailResult = await mailService.SendMailAsync((formData));

    return RedirectToAction("Index", "TrialConfirmation");
}

对于这么小的事情,您可以将逻辑提取到控制器中的其他方法:

[HttpPost]
public async Task<ActionResult> Index(Customer formData) {
    if (!ModelState.IsValid) {
        return View();
    }

    var ok = await CreateTrial(formData);
    return ok 
        ? (ActionResult)RedirectToAction("Index", "TrialConfirmation")
        : View(formData);
    }
}

protected async Task<bool> CreateTrial(Customer formData) {
    var apiOneService = new ApiOneService(formData);
    if (apiOneService.ExistingUserCheck()) return false;

    var emailTask = mailService.SendMailAsync((formData));
    var apiTwoResult = serviceTwo.CreateTrial(formData);
    await emailTask;

    return true;
}

对于更复杂的方法,您也可以将逻辑提取到单独的类或层中。

您可以简化控制器,直到:

https://github.com/DashboardCode/Routines/blob/master/AdminkaV1/Injected.AspCore.MvcApp/Controllers/UsersController.cs

在这里,您只能看到元数据定义:什么是id,哪些字段需要加载数据(一对多,多对多等等)。

实际上,您在问如何编写内部DSL,以“更大的砖块”定义我的控制器。 随便写吧。

可能但不能带来完全的满足。 人们坚持使用通用代码,因为它是通用的。 即使冗长。

我倾向于在某些类似情况下实现服务层,并通过依赖项注入公开接口。 逻辑在服务层中,控制器只是将此逻辑暴露给视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM