微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是我每次在MVC3中请求新页面时创建的控制器构造函数的实例

如何解决是我每次在MVC3中请求新页面时创建的控制器构造函数的实例

| 我的控制器的构造函数中有很多东西。每次我使用MVC3请求新页面时,构造函数都会执行吗?     

解决方法

        需要一个控制器实例来满足每个请求。为了获得该实例(显然),每个请求都调用控制器构造函数。话虽这么说,您应该避免在此构造函数中执行许多操作。例如,在某些情况下,对于此控制器上的某些特定动作,您不需要所有此初始化,并且即使将其放入构造函数中,它也将被执行。如果您执行的任务只是实例化控制器所需的其他一些依赖关系,那么您就不必担心性能,而应该担心正确构建应用程序,因为此工作应由DI框架处理。 另一个常见的陷阱是,在构造函数内部,您尚无法访问HttpContext,并且某些属性(如Request,Response ...)可能在控制器构造函数中不可用。它们在Initialize方法中可用。 所有这些都表明我建议您避免在构造函数中放置代码(除了将ctor参数依赖项存储到私有变量中,以便注入诸如服务,存储库之类的东西外)。     ,        Controller基类包括ControllerContext,它是控制器的每个请求上下文,例如,它包含对HttpContext的引用。 让它一下子沉没。 编写自定义ControllerBuilder或使用新的DependencyResolver使用您喜欢的DI容器来提供单例控制器非常容易。但是,这意味着您的控制器可能会保留先前请求的状态。 实际上,当人们使用Castle Windsor(我已被告知默认使用Singleton)创建控制器时,最常见的错误之一就是他们的行为怪异。 正如其他人指出的那样,如果您的控制器在构造函数中做了很多工作,则将其重构为对控制器的依赖关系,该依赖关系将通过控制器的构造函数传入。让我们将该依赖项称为“服务”。 该服务本身可以是单例(只要它不保持每个请求的状态),并且您可以将DependencyResolver与DI容器结合使用以实例化控制器。     ,        这取决于ControllerFactory的确定;控制器工厂为控制器实例提供服务。您可以构建缓存控制器的功能,但是:最好不要通过控制器的ctor传递那些引用。最好分别缓存每个引用,并在构造期间传递给控制器​​,并让控制器每次都重新创建。如果缓存控制器,它将缓存其他引用,例如HttpContext,这可能不是当前请求。 HTH。     ,        是的,M Jacob先生,这可以帮助我们在每个请求中为新的DataContext发出数据访问请求,这非常有效。建议在每个请求中初始化一个新的DataContext(在您的控制器构造函数中),而不要创建持久性DataContext。     ,        互联网是无状态的,服务器无法真正将您与其他任何人区分开(从技术上讲,忽略了会话和cookie)。将向您提供内容,并且与您的连接结束。根据您的新要求,事情从头开始。我同意您的看法,即无法使对象保持活动状态是一项开销,但如果百万个用户对同一对象发出不同请求的请求,则开销会更大。保留同一对象的数百万个副本几乎是不可能的。 问候, 胡斯克     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。