Запрос Orchard CMS от IShapeFactoryEvents - PullRequest
       26

Запрос Orchard CMS от IShapeFactoryEvents

2 голосов
/ 13 сентября 2011

Я пытаюсь вставить фигуры в свой макет из моего модуля, как только он был включен.Я подумал, что IShapeFactoryEvents будет идеальным для этого, но запрос CMS отсюда дает мне «исключение TransactionScope, вложенное неправильно», если это происходит во время POST.Хотите знать, есть ли у кого-нибудь слова мудрости для меня снова?Смотрите мой фрагмент кода ниже.

    public void Created(ShapeCreatedContext context)
    {
        if (context.ShapeType == "Layout")
        {                
            if (!AdminFilter.IsApplied(_services.WorkContext.HttpContext.Request.RequestContext))
            {
                var route = RouteTable.Routes.GetRouteData(_services.WorkContext.HttpContext);
                object location;
                if (route.Values.TryGetValue("location", out location))
                {
                    var region = _services.ContentManager.Query("Region")
                        .Join<RoutePartRecord>()
                        .Where(x => x.Slug == (string)location)
                        .Slice(1).FirstOrDefault();

                    context.Shape.Header.Add(context.New.CurrentRegion(Title: region.As<RoutePart>().Title), "10");
                }
                context.Shape.Navigation.Add(context.New.RegionSelector(Regions: _services.ContentManager.Query(VersionOptions.Published, "Region").List()), "11");
            }
        }
    }

Еще раз спасибо заранее.Вы, ребята, потрясающие.

1 Ответ

1 голос
/ 14 сентября 2011

Смотрите сообщение в блоге, которое я написал по этой самой теме, здесь: http://chrisbower.com/2011/02/15/orchard-shape-wizardry/

Из сообщения в блоге:

"Одна вещь, которую я должен отметить, и это взяло меняцелый день, чтобы выяснить, это то, что вы не можете просто внедрить свою службу данных в реализацию IShapeTableProvider. Если вы это сделаете, она попытается использовать транзакцию вне области видимости, и это вызовет у вас всевозможные проблемы.В течение нескольких часов я наконец-то обнаружил, что команда Orchard делает внутри класса CoreShapes: хитрость для разрешения зависимости службы внутри самой функции с помощью свойства, которое загружает службу по запросу. "

Попробуйте вместо этого использовать свой сервис:

private IOrchardServices Services     
{
    get
    {
        return _workContextAccessor.GetContext(_httpContextAccessor.Current()).Resolve<IOrchardServices>();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...