我正在重构一些我在经验不足时编写的代码,并且已经将逻辑从我的控制器转移到某些模型,试图使我的控制器更具可读性。
有一项功能我不是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模型;到所述模型进行处理。还有一些数据库操作正在进行,这个操作相当短,让我想知道是否值得将它留在控制器中移动它。这里最好的代码练习是什么? (出于显而易见的原因删除了凭证)
答案 0 :(得分:1)
当发布的应用程序随后被包装在DLL中时,抽象凭证始终是一个更安全的选项。 DLL可以被解构和逆向工程,因此它不是一种保护代码但却有帮助的万无一失的方法。
我的应用程序往往有三层安全性和整洁性。首先,我在一个项目中使用DataAccess Layer,在另一个项目中使用Business Logic,并且所有控制器都在一个地方将它们集中在一起。所以它也分离了UI。我认为这是大多数英国软件开发公司的标准做法。如果您愿意,您可以进一步抽象出来,保险公司和金融机构等地方可以有20层或30层,具体取决于数据的整体操作方式,但对于个人项目,我发现这三层工作正常。
希望一些漫无边际的帮助!
答案 1 :(得分:1)
通常保留在控制器内的只是从command
实现发出interface
让我们说(SendEmail方法),这使得控制器不依赖于邮件的发送方式
这意味着控制器仅负责将视图与模型连接。因此,逻辑应理想地位于模型或服务中的某个位置。
然后该服务由DI注入控制器。