我正在编写我的第一个MVC(v3)应用程序,我认为我已经错误地组织了我的控制器。我很感激一些指导/建议。
这一切都是因为我使用Ninject进行依赖注入,并希望它为每个“请求”只为我的具体DataRepository创建一个实例。通过在Ninject绑定中指定InRequestScope(),这很容易做到......但在这样做之后,我仍然看到我的DataRepository的多个实例正在创建。
在我挠了头很长一段时间后,我开始监视MvcApplication类中的BeginRequest事件(在global.asax文件中)。瞧,我曾想到的单个“请求” - 例如,来自浏览器的单个回发 - 实际上产生了多个连续请求。根据InRequestScope()声明,Ninject为每个请求尽职地创建了一个DataRepository实例。
不幸的是,这不是我想要的。我想要的是为该单个浏览器启动的“请求”创建的DataRepository的一个实例。我不知道如何通过Ninject做到这一点。我知道我可以指定InSingletonScope(),但是虽然这将使用一个DataRepository实例作为“请求”,但实例将会挂起,直到webapp重新启动。这导致了我各种各样的Entity Framework缓存问题。
在监视BeginRequest事件时,它看起来像每次调用不同的控制器时生成新请求。事后看来,这是有道理的,但它与我的应用程序的设计不一致。例如,我有一些常见的动作方法,各种其他动作方法链接到(我这样做,而不是在不同的控制器中复制相同的代码和视图)。
所有这些让我想知道以下内容:如果我想最小化我的DataRepository实例化的次数,我必须最小化一个控制器链接到另一个控制器的次数。这似乎意味着我的行动方法需要合并,并可能在多个控制器中重复。
这似乎......很奇怪。如果这是正确的做事方式,那么,我可以忍受它。但我很想知道我在设计MVC应用程序时缺少其他东西:)。例如,我应该将这些常用功能集中在服务层中,并且每次请求只实例化一次吗?如果这是一个愚蠢的问题,请道歉;我真的不了解服务层的概念。
答案 0 :(得分:2)
关于你的上一个问题:保持控制器没有任何业务逻辑总是更好。他们的主要目的是管理自己的观点。任何业务逻辑都属于适当的业务层。
此外,我认为不要过于频繁地重用存储库实例是一个很好的设计。任何事务都应该使用自己的实例。见“工作单位”。在大多数情况下,这意味着每个请求一个实例只读数据(如产品目录)的存储库当然可以通过在单一范围内声明它们来重复使用。