Обеспечение доступности служб Orchard в веб-формах: отключить удаление служб Orchard IOrchardService?

После добавления нового модуля в решение Orchard в VS 2013 в методе индекса домашнего контроллера я сохраняю 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 Services в сеансе выполняется перенаправление на страницу WebForms: default.aspx. Это успешно перенаправляет.

Проблема в том, что когда я получаю доступ к вышеупомянутому сеансу ["OrchardCMServices"] на моей странице ASPX, ContentManager удаляется, и я не могу выполнить запрос с использованием методов GET. Ошибка: объект удален

Как я могу отключить/предотвратить удаление объектов сеанса при перенаправлении с MVC на Asp.NET? Я не нашел никаких настроек modules в web.config приложения MVC.

Есть ли способ сделать службы Orchard ( ContentManager ) доступными в веб-формах ?

введите здесь описание изображения


person R.C    schedule 25.08.2015    source источник
comment
Не похоже, чтобы люди знали, как сделать Orchard совместимым с Webforms. Возможно, если вы обновите вопрос, описывающий вашу конечную цель, может быть другой способ представить данные на этой внешней странице?   -  person rtpHarry    schedule 27.08.2015
comment
@rtpHarry: Спасибо за ответ и предложения. Да, есть способы представить данные на внешней странице, например запросить базу данных SQL CE непосредственно в моих приложениях веб-форм. Это был один из путей. Но, поскольку мы использовали ORCHARD CMS, моей единственной целью было проверить, есть ли способ сделать службы Orchard доступными и для страницы веб-форм.   -  person R.C    schedule 27.08.2015
comment
Я просто работаю над папкой OrchardDocs и наткнулся на эту статью. Он неполный и нацелен на Orchard v0.5, но я подумал об этой ветке и решил, что по крайней мере опубликую ее.   -  person rtpHarry    schedule 28.08.2015


Ответы (1)


Услуги в Orchard имеют разный объем в зависимости от их назначения. IOrchardServices имеет пожизненную область действия запроса, поэтому он будет уничтожен в конце запроса.

Запрос: экземпляр зависимости создается для каждого нового HTTP-запроса и уничтожается после обработки запроса. Используйте это, производя свой интерфейс от IDependency. Создание объекта должно быть достаточно дешевым. http://docs.orchardproject.net/Documentation/How-Orchard-works

И вы можете видеть, что IOrchardServices — это IDependency.

public interface IOrchardServices : IDependency {...

Поэтому вам не следует пытаться сохранить службу в текущем сеансе. Если вам нужно получить доступ к сервису в представлении, вы можете разрешить его, используя рабочий контекст следующим образом:

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

Или, если в вашем модуле есть контроллер, который отображает страницу, вы можете внедрить зависимость как обычно.

person aalcutt    schedule 25.08.2015
comment
Хм... Я понимаю. Итак, что, если я хочу получить доступ к OrchardService на одной из моих страниц WEB FORMS (.aspx) на самом деле, а НЕ в каких-либо представлениях MVC. Есть ли способ сделать это ? Страницы ASPX присутствуют в образце модуля HelloWorld, который я создал, как задокументировано в Orchard. Как вы можете видеть в методе INDEX() контроллера, я просто перенаправил на страницу ASPX, и на странице ASPX я попытался прочитать обратно значение сеанса, где я затем снова запросил Content Manager как: int itemID = 12; ContentItem iTem = this.Services.ContentManager.Get(itemID);. Это строка, которая выдает ошибку на странице ASPX — - person R.C; 25.08.2015
comment
Я потратил еще некоторое время на изучение этого и не смог найти способ получить доступ к каким-либо зависимостям внутри веб-формы. Orchard делает много пользовательских вещей для внедрения зависимостей в представление, которое просто невозможно использовать на странице веб-формы. - person aalcutt; 26.08.2015
comment
Благодарим вас за то, что нашли способ сделать службы Orchard доступными в веб-формах. Даже я сам теперь пришел к выводу, что почти невозможно сделать эти услуги Orchard доступными на странице веб-форм. Поскольку в веб-формах было несколько страниц, которым требовались данные, поэтому в настоящее время мы запрашиваем эти таблицы отдельно, используя способ Ado.NET... Дайте мне знать, если вы знаете другие лучшие альтернативные способы.... - person R.C; 27.08.2015