首先,我已经看到了很多这样的问题,但没有足够的理由落后。 如果我的问题是不够的,应予删除我就明白了。
我已经采取一看,例如, 这和45+投票起来回答说,他建议你把业务逻辑模型,这听起来很合乎逻辑的。
然而,我的第一个大型项目我已经用我所有的BL完全在控制器完成的,因为我没有质疑这些东西,看着它是如何在做AccountController
是,如果你选择MVC与形式认证的自动添加。 所有这些方法看起来很配备BL酿。 或者,也许这是要添加的代码是尽可能少,我俯瞰的东西呢?
YouTube上的人问我他是否是把所有的逻辑放到他的模型正确,起初我没有! 然后我就开始想,也许他是对的!?
所以,毕竟我在哪里把我的商业逻辑? 如果是在模型类,那么,有多少代码应被视为是在控制器的方法健康的量? 一号线调用从模型在控制器最多一些方法,然后返回到视图?
Answer 1:
我喜欢把域逻辑模型中的一对夫妇的原因。
该模型应该有它没有用户界面代码,因此更容易进行测试。 只要有可能,我喜欢编写任何UI代码之前必须有一个充分的工作(这意味着完整的测试覆盖率)模型。 该控制器可以相信,该模型是在做正确的事情,只是处理UI的关注。
如果你把域逻辑控制器,它不是那么容易不同的应用程序之间共享,甚至是不同的控制器之间。
Answer 2:
我喜欢让我的模型清除IE只是性质和没有业务逻辑。 我一直认为其良好的依赖注入控制器和这些依赖性包含我在我的模型执行的逻辑。 我喜欢坚持单一职责原则在可能情况下,我发现有吨的方法模型得到臃肿非常快。 有利弊两个,注入很大的依赖性有一个开销但允许在隔离测试,并保持类的简单,你会最终不得不精简控制器。 尽管我没有逻辑实际存在在我的模型类,它仍然业务逻辑的成员。 我往往没有在控制器嘲讽之类的HttpContext定义是一场噩梦,没有必要的位业务逻辑。
Answer 3:
业务逻辑属于问题域,一切都属于问题域去在MVC 模型 。
该控制器应负责从模型传递数据到视图和从视图回到模型。 因此,控制器之间有什么给用户和程序是如何相互作用的模型和存储的问题状态的桥梁。 的管道 ,可以这么说。
这里的关键是业务逻辑和管道逻辑之间的区别。 在我看来,什么自动生成的账户控制器的作用是主要的管道,没有真正的商业逻辑。 请记住,管道逻辑不一定短好,所以就不需要施加人为限制(如“至多在控制器调用的X号”)。
Answer 4:
我当从web表单(asp.net)转移到MVC开发团队做了很多的研究,并与下面的结构上来。 据我它不是大或小的应用程序。 其对保持代码简洁明快。
DALProject
AccountsDAL.cs --- > Calls SP or any ORM if ur using any
BLLProject
AccountsBLL.cs ---> Calls DAL
WebProject
Model
AccountsModel --- > Contains properties And call BLL
Controllers
IndexController ---> Calls Models and returns View
Views
Index
控制器应负责模型和视图之间传递数据。 除此之外,它不应该有任何不必要的代码。 例如,如果您正在记录应该在模型级别,而不是控制器来完成。
Answer 5:
似乎是围绕这个话题有些混乱。 天色似乎人们往往混淆了N层架构MVC模式作为要么/或情况。 现实情况是,这两种方法可以一起使用,但一个不依赖于其他的也不是必需的。
N层架构涉及分离的应用程序划分为多个层。 一个简单的例子是其中应用被分成表示层,业务逻辑层和数据访问层。
MVC是处理应用程序的表现层的设计模式。 这是完全可能的,而不从表示层分离业务逻辑和数据访问逻辑设计以下的MVC方法的应用程序,因此具有单个层设计结束。
结果,如果你是以下也没有分离到应用层的MVC的做法是,你最终有业务规则和数据访问逻辑与逻辑的其余部分混合位模型,视图和控制器。
根据定义,在N层架构,表示层只应该能够与业务逻辑层进行沟通,所以应该认为任何MVC组件只能与业务逻辑层进行通信。
如果你正在建设,不涉及呈现,因而不表示层的应用程序,你不应该有MVC模式关心自己。 不过,你说的可能还是你的应用程序分割成多个层次,因此后续的N层设计,即使不涉及表示层。
Answer 6:
一般来说,业务逻辑不应该存在于任何的MVC玩家; 它应该只由你的控制器动作来消耗 。
正如许多人所说,这是最好创建一个图书馆举办的业务逻辑为一组客户端无关,可重用的组件。
当使用这种方式时,我们大大提高可重用性,兼容性,可扩展性和可测试性与我们的软件。 我们还减少了我们对某些框架功能的依赖,这使得它更容易迁移到新的/不同的技术。
抽象我们的业务逻辑成一个独立的组件(或组件)一直行之有效多年来。 我们的业务逻辑然后可以通过几乎任何.NET技术被消耗(ASP.NET MVC / API /核心,WPF,赢形式,WCF,UWP,WF,控制台等)。
此外,我们希望我们的中间层来处理业务规则和验证逻辑,以减少对.NET MVC框架的依赖我们。 例如,我们避免使用.NET MVCS验证辅助,而是要靠我们自己。 这是另一个因素,使我们能够轻松地从任何.NET技术消耗我们的业务逻辑。
从逻辑上设计我们的中间层,这种方式使我们能够轻松地实现这个物理架构:
它是书面Peasy.NET ,并一直运作良好,多年来。 如此出色的事实,我们决定开源它。
如果有人好奇,就是我们中间层的样子,这里是一个样本客户端无关,业务层。 它也展示了它由多个.NET客户端(ASP.NET MVC,网络API和WPF)的消耗量。
希望这可以帮助别人!
Answer 7:
我喜欢让我的模型清洁以及(参考:@马克沃尔什)。 不能够重复使用嵌入控制器逻辑的问题可以,如果你认为会有太多的是,通过接口暴露你的业务/域逻辑,并在控制器使用Facade模式极易被克服依赖注入,或。 这样,你得到你所需要的功能,但保留两个控制器和模型非常干净。
Answer 8:
我也希望保持模型的清洁。 MVC的控制器只应该用于拨打电话,因此也应保持清洁。 所以,这取决于它的可重用性,敏感性和相关性的业务逻辑可以写成
1.WebApi控制器:使用的WebAPI控制器的好处是,你可以稍后公开这些为服务,以使您的代码可重复使用的其他设备。
2. BAL /常用commonent:有一些逻辑其具有特定的使用,并且不能被暴露作为API,可以在这个类推。
3.库:所有的数据库相关的查询在库中添加。 有可能,这将实现每个表中的所有功能(CRUD操作)或特定存储库通用存储库。 取决于要执行的操作。
Answer 9:
作为ahanusa写道,你应该把你的业务逻辑为单独的DLL或单独的目录。
我经常使用的模型和控制器的同级目录名为逻辑,我把它做的业务逻辑类。
这样,我让两个模型和控制器的清洁。
Answer 10:
我知道这是一个关于MVC的问题,但我觉得我给的例子(网页API)将是有用的。
我发展我的第一个Web API,我从其他应用程序的业务逻辑重新使用。 具体而言,它来自外部DLL,所以我的API是只是用来“交谈”与SAP解决方案,从接收订单请求和发送响应回。
我怎么可以把我的逻辑(已经实现)到我的控制器? 我并不需要它。 我的控制器将只接收,验证请求和响应的组合将数据发送回。
我与视图模型类的工作,他们都必须是一个映射函数,只是为了读TransferObjects信息(即来自外部DLL),并转化为一个视图模型。
我不舒服我抱着业务逻辑(在这种情况下的Web API)应用程序,我认为可重用性会以这种方式丢失。
我治疗我的业务逻辑,我注入控制器的依赖。
我已经做了很多的重构在传统提供了单元测试的解决方案,我不得不创建大量的接口和实现一些设计模式为传统的提供这种解决方案。
在我的观点来看,业务层必须是分开的应用程序的,最好是在另一个类库。 所以,你会在你的应用程序中实现真正的分离概念。
当然,如果你的核心(业务)为您的应用程序(API /网站),业务规则将被实施到你的MVC类。 但在未来,如果你要开发一个新的应用程序和一些业务规则都是一样的,我敢打赌,你将有很多的问题,只是为了保持在这两个应用程序中实现相同的逻辑。
文章来源: MVC: Where to put business logic?