C#清洁视图控制器

时间:2016-11-25 01:00:24

标签: c# asp.net-mvc-4 model-view-controller

我正在重构一些我在经验不足时编写的代码,并且已经将逻辑从我的控制器转移到某些模型,试图使我的控制器更具可读性。

有一项功能我不是100%肯定会在提交后通过电子邮件发送一个表单。问题代码写为:

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> NewUser(Request model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }

            Offer_Request req1 = new Offer_Request();
            Offer_Request req2 = new Offer_Request();
            req1.Request = req2.Request= model;
            req1.offerID = 1;
            req2.offerID = 2;

            using (var ctx = new UserDBEntities())
            {
                ctx.Request.Add(model);
                ctx.Offer_Request.Add(req1);
                ctx.Offer_Request.Add(req2);
                ctx.SaveChanges();
            }

            string link1 = Url.Action("EmailHandler", "Home", routeValues: null, protocol: Request.Url.Scheme);
            string link2 = Url.Action("EmailHandler", "Home", routeValues: null, protocol: Request.Url.Scheme);
            link1 = link1 + "?id=" + req1.ID.ToString();
            link2 = link2 + "?id=" + req2.ID.ToString();
            var body = "<p>New request from {0} at {1}</p><p>Please choose from the following</p><br><p>One day access token:</p><p>{2}</p><br><p>5 day access token</p><p>{3}</p>";
            var subject = "{0} wants to connect!";
            var message = new MailMessage();
            message.To.Add(new MailAddress(model.SponsorEmail));
            message.From = new MailAddress(##########);
            message.Subject = string.Format(subject, model.FirstName);
            message.Body = string.Format(body, model.FirstName, model.Email, link1, link2);
            message.IsBodyHtml = true;

            using (var smtp = new SmtpClient())
            {
                var credential = new NetworkCredential("########", "##########");
                smtp.Credentials = credential;
                smtp.Host = "smtp.office365.com";
                smtp.Port = 587;
                smtp.EnableSsl = true;
                await smtp.SendMailAsync(message);
            }

            return RedirectToAction("Sent");
        }

我想知道是否应该将电子邮件逻辑移到模型中,如果我可以通过我的Request模型;到所述模型进行处理。还有一些数据库操作正在进行,这个操作相当短,让我想知道是否值得将它留在控制器中移动它。这里最好的代码练习是什么? (出于显而易见的原因删除了凭证)

2 个答案:

答案 0 :(得分:1)

当发布的应用程序随后被包装在DLL中时,抽象凭证始终是一个更安全的选项。 DLL可以被解构和逆向工程,因此它不是一种保护代码但却有帮助的万无一失的方法。

我的应用程序往往有三层安全性和整洁性。首先,我在一个项目中使用DataAccess Layer,在另一个项目中使用Business Logic,并且所有控制器都在一个地方将它们集中在一起。所以它也分离了UI。我认为这是大多数英国软件开发公司的标准做法。如果您愿意,您可以进一步抽象出来,保险公司和金融机构等地方可以有20层或30层,具体取决于数据的整体操作方式,但对于个人项目,我发现这三层工作正常。

希望一些漫无边际的帮助!

答案 1 :(得分:1)

通常保留在控制器内的只是从command实现发出interface让我们说(SendEmail方法),这使得控制器不依赖于邮件的发送方式

这意味着控制器仅负责将视图与模型连接。因此,逻辑应理想地位于模型或服务中的某个位置。

然后该服务由DI注入控制器。