在Web窗体中提供Orchard服务:禁用处置Orchard Services IOrchardService?

时间:2015-08-25 11:54:56

标签: asp.net asp.net-mvc-4 orchardcms orchard-modules orchardcms-1.9

在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的同时禁用/防止处理会话对象?我在MVC应用程序的modules中找不到任何web.config设置。

有没有办法在Web窗体上提供Orchard服务(ContentManager)?

enter image description here

1 个答案:

答案 0 :(得分:1)

Orchard中的服务具有不同的范围,具体取决于其用途。 IOrchardServices具有终身请求范围,因此它将在请求结束时销毁。

  

请求:为每个新的HTTP请求创建一个依赖项实例,并在处理完请求后销毁。通过从IDependency派生您的接口来使用它。该对象应该相当便宜创建。   http://docs.orchardproject.net/Documentation/How-Orchard-works

你可以看到IOrchardServices是一个IDependency。

public interface IOrchardServices : IDependency {...

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

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

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