asp.net-mvc – 如何在Controller中使用依赖注入和存储库模式时
发布时间:2020-12-16 09:24:05 所属栏目:asp.Net 来源:网络整理
导读:因此,使用带有MVC(或Web API)的Repository模式的所有DI示例中的99%在控制器动作中显示类似于此的内容(省略_repository的构造函数注入代码).问题在于假设不需要首先处理任何事情(如规则)并立即开始持久性: public ActionResult Create(Person person){ if (
因此,使用带有MVC(或Web API)的Repository模式的所有DI示例中的99%在控制器动作中显示类似于此的内容(省略_repository的构造函数注入代码).问题在于假设不需要首先处理任何事情(如规则)并立即开始持久性:
public ActionResult Create(Person person) { if (ModelState.IsValid) { _repository.Add(person); } return View(person); } 问题是,如果我需要在持久化对象之前处理域层中的规则怎么办?显然我不是在Controller中做那个逻辑,而是在域层中需要它.以下哪个选项更好: 选项1:在域/业务层中调用要在存储库中调用的所有持久性详细信息,然后退出控制器.更新后的代码如下所示: if (ModelState.IsValid) { using (busniessLogic = new MyApp.BusniessLogic(_repository)) { busniessLogic.ProcessRulesAndSavePerson(person); } } 域层可能有这样的方法: public void ProcessRulesAndSavePerson(Person person) { //process some rules... if(rules = true) { //use injected repository to add now that rules have passed _repository.Add(person) } } 选项2:在Controller中与现在保持一致,但只需在保存到存储库之前调用处理规则.更新后的代码如下: if (ModelState.IsValid) { using (busniessLogic = new MyApp.BusniessLogic()) { busniessLogic.ProcessRulesAboutPerson(person); _repository.Add(person) } } 我也对其他想法持开放态度,但我倾向于选项#1.我喜欢保持Controller很薄,只是将注入的_repository传递给需要它的层. 对此有任何帮助表示赞赏,谢谢! 解决方法
这两个选项都会创建对业务逻辑处理器的依赖,在使用new关键字时总是要小心,因为当您尝试对方法进行单元测试时,您几乎总会遇到问题,这会破坏依赖注入的目的.
您最好创建一个处理复杂业务逻辑并将其注入控制器的服务.如果您的大多数逻辑都很复杂,我会跳过将存储库一起传递给控制器??,并依赖服务来为我处理所有事情. 控制器: public MyController(IPersonService personService) { _personService = personService; } public ActionResult Create(Person person) { if (ModelState.IsValid) _personService.Create(person); else ...... } PersonService: public PersonService(IPersonRepository repo) { _repo = repo; } public int Create(Person person) { //businesslogic return _repo.Add(person); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Asp.net MVC – 多语言网站
- asp.net-mvc – ASP.NET MVC:从一个视图重定向到另一个视图
- asp.net-mvc – 使用Windows身份验证与活动目录组作为角色
- asp.net-mvc-2 – RedirectToRouteResult如何工作?
- ASP.NET Webforms验证框架的建议
- asp.net – Jquery datepicker弹出窗口在IE8的选择日期没有
- asp.net – 兼容性问题是IE10
- 在asp.net中减少ViewState大小的策略
- asp.net – Favicon没有显示
- OAuth(OAuth2)ASP.NET REST Web API(自我主机 – Windows服
推荐文章
站长推荐
热点阅读