我试图找出一种好的(如果可能的话,最好的)方法来构造一个解决方案,在该解决方案中,我可以在使用EF6将更改提交回数据库之前,对控制器中的MVC模型进行一些工作。
所以这是一个示例-我在我的一个控制器类中有以下代码:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Role role)
{
if (ModelState.IsValid)
{
db.Entry(role).State = EntityState.Modified;
//***********---> HERE IS WHERE I WOULD PLACE THE PRE-SAVECHANGES CALL
db.SaveChanges();
return RedirectToAction("Index");
}
return View(role);
}
如上所述,我想在db.SaveChanges()之前调用“ pre-savechanges”函数。关键是我想对所有控制器执行此操作,并且我希望在所有控制器中调用此函数的方式都相同,以便此预保存实现是一致的(换句话说,函数名称应该相同,并且应该将模型作为参数-我正试图避免以任何方式将函数名称与模型名称绑定在一起)。例如,该函数可以称为PreSaveChanges,它将需要访问将要持久化的模型(角色,在这种情况下,如上面的代码所示)。
我知道有很多方法可以实现此目的,但我想到的一种方法是仅向每个模型添加一个函数-但我没有看到模型中的函数示例,而且我没有足够的经验来理解结果(例如作为可测试性)。我还考虑了某种控制反转/依赖注入解决方案,因为这通常是一个流行的选择。无论采用哪种方法,我都不需要实际保存pre-savechanges功能。换句话说,某些控制器将具有需要在持久化之前进行预处理的模型,而其他控制器则不需要。我仍然希望我所有的控制器都尝试调用pre-savechanges函数,但是如果尚未定义或不存在它,那么那就是“
因此,快速浏览一些选项:
我曾考虑过在实用程序类中创建一个静态函数,该函数会将我的模型(在这种情况下,是保修模型)作为一个参数-但后来我不知道接收函数是应该接受通用类型还是应接受类型为“对象”类型-两者都需要一些反射代码,以便我知道已传递了哪种模型。我可能会有一个很大的'if'块来查看类型(如果是角色,则执行此操作;如果是用户,则执行此操作;等等)。我的控制器中的调用可能看起来像这样:
Utility.PreSaveChanges(warrantymodel);
如果您认为这是最好的方法,那么PreSaveChanges应该具有类型为object的参数还是应该接受通用类型?
我还认为可以将pre-save函数放入模型本身。我喜欢在模型中包括预保存功能代码的想法,如上所述,但是我只是不知道这是一个好主意。该代码如下所示:
warrantymodel.PreSaveChanges();
如果您认为这是最好的方法,那么您可以确认在模型中包含函数是可以的吗?这会打破某种MVC原则吗?
我只是摸摸了依赖注入的表面,所以我不知道这是否对您有帮助。如果可以的话,我很乐意看到一个简短的示例(我对DI已有足够的了解,因此无需过多解释就可以理解它)。
如果您在模型类中进行任何工作,那么不仅模型类中应该包含函数,还应该包含函数。将模型的行为和逻辑封装在模型所属的模型类中。永远不在控制器中!想想FAT模型,SKINNY控制器。
其次,如果您想PreSaveChanges
在所有模型上实现该功能,则可能会创建一个类似的接口IPreSaveFunctionality
,其中包含一个PreSaveChanges
方法存根,并让每个模型都实现您希望的接口PreSaveChanges
。
但是,如果您传递给它的任何模型的逻辑都是相同的,那么我将创建一个BaseModel
类并在该类中创建一个虚拟方法,并让您的所有其他模型派生自其中,BaseModel
并且某些模型对此功能的实现方式有所不同那么您始终可以PreSaveChanges
在该模型类中覆盖该单个模型的实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句