使 Orchard 服务在 Web 表单中可用:禁用处理 Orchard 服务 IOrchardService?

Making Orchard Services Available in Web Forms: Disable Disposing Orchard Services IOrchardService?

在 VS 2013 中向 Orchard 解决方案添加新模块后,在 Home Controller 的 Index 方法中,我将会话中的 IOrchardServices 保存为:

public class HomeController : Controller
    {
        public IOrchardServices Services { get; set; }

    public HomeController(IOrchardServices services)
    {
        Services = services;
        T = NullLocalizer.Instance;
    }

    public Localizer T { get; set; }

    public ActionResult Index()
    {
           Session["OrchardCMServices"] = Services;
           return Redirect("/OrchardLocal/modules/HelloWorld/default.aspx");
    }

在会话中存储 Orchard 服务后,重定向到 WebForms 页面:default.aspx 完成。这确实重定向成功。

问题是,当我在我的 ASPX 页面中访问上面的 Session["OrchardCMServices"] 时,ContentManager 被释放,我无法使用 GET 方法进行查询。错误是:对象处置

如何在从 MVC 重定向到 Asp.NET 时 Disable/Prevent 处理会话对象?我没有在 MVC 应用程序的 web.config 中找到任何 modules 设置。

有没有办法让 Orchard Services ( ContentManager) 在 Web Forms 上可用?

Orchard 中的服务根据其用途具有不同的范围。 IOrchardServices 有一个生命周期的请求范围,所以它会在请求结束时销毁。

Request: a dependency instance is created for each new HTTP request and is destroyed once the request has been processed. Use this by deriving your interface from IDependency. The object should be reasonably cheap to create. http://docs.orchardproject.net/Documentation/How-Orchard-works

并且您可以看到 IOrchardServices 是一个 IDependency。

public interface IOrchardServices : IDependency {...

因此您不应尝试在当前会话中存储该服务。如果您需要在视图中访问该服务,您可以像这样使用工作上下文来解决它:

var orchardServices = WorkContext.Resolve<IOrchardServices>();

或者,如果您的模块有一个正在呈现页面的控制器,您可以正常注入依赖项。