如果我理解您的问题,您是在要求从当前执行的操作方法中调用其他控制器的操作方法吗?你通常不会那样做。Controller的action方法的第一条规则是:任何action方法都不能超过10行代码。基本上,动作方法实际上应该是一种简单的方法来收集视图,或在您的域中调用动作并返回。
换句话说,SRP 模式:
http ://codebetter.com/karlseguin/2008/12/05/get-solid-single-responsibility-principle/
相反,您将为这个重复的代码组织您的域逻辑(您所描述的被认为是域模型逻辑,而不是控制器逻辑),例如在此处删除问题,但是当用户被删除时,也会删除问题等。
// an example of IOC injection of your IUserService
private IUserService
public RegistrationController(IUserService userService)
{
_userService = userService;
}
[HttpPost]
public ActionResult Delete()
{
// insert modelstate and/or validation logic
//
if (User.Identity.IsAuthenticated == false)
{
return RedirectToAction("index", "Home");
}
// good practice to never bubble up exceptions to users
try
{
if (_userService.DeleteByEmail(User.Identity.Name) == false)
{
ModalState.AddModelError(String.Empty, "Not allowed?");
return View();
}
// save it all in a single atomic operation here to keep it all in
// a single Transaction Scope that will rollback properly if there is
// an error.
//
db.SaveChanges();
}
catch (Exception)
{
ModalState.AddModelError(String.Empty, "An error occurred...");
return View();
}
// all ok!
return RedirectToAction("logout");
}
注意这个动作方法是多么干净。它只是用一两行代码和一大堆退出路径来处理用户在许多不同情况下的体验。
现在,您的域逻辑可以封装到服务(或提供程序等)中:
namespace MyWebsite.Models
{
public class UserService : IUserService
{
// Todo: convert to some IoC lovin'
//
public Boolean DeleteByEmail(String email)
{
var user =
(from user in db.Registrations
where
user.Email == email
select s).FirstOrDefault();
if (user == null)
return false;
// call into other services to delete them
ProfileDataService.DeleteByUserId(user.UserId);
QuestionsService.DeleteByUserId(user.UserId);
// finally, delete the user
db.Registrations.Delete(user);
// note, I am NOT calling db.SaveChanges() here. Look
// back at the controller method for the atomic operation.
//
return true;
}
}
}
这可以通过 100 种不同的方式实现。关键是将逻辑抽象到一个公共代码库或“域”中。在此示例中,我选择将该逻辑放在模型下的当前网站名称空间中作为快捷方式。
至于Delete()
其他控制器上的其他方法,您只需调用 aQuestionsService.DeleteByUserId()
并ProfileDataService.DeleteByUserId()
处理这些方法。您甚至可以跨域共享这些服务,如我上面所示。