Добавление нового индивидуального стиля жизни в Windsor Container - PullRequest
2 голосов
/ 05 октября 2011

Я хочу добавить для каждого сеанса образ жизни одного из моих контроллеров в приложении ASP.NET MVC, но в настоящее время у него нет такой опции.Я искал переполнение стека и нашел следующее решение

    public class PerSessionLifestyleManager : AbstractLifestyleManager
    {
        private readonly string PerSessionObjectID = "PerSessionLifestyleManager_" + Guid.NewGuid().ToString();

        public override object Resolve(CreationContext context)
        {
            if (HttpContext.Current.Session[PerSessionObjectID] == null)
            {
                // Create the actual object
                HttpContext.Current.Session[PerSessionObjectID] = base.Resolve(context);
            }

            return HttpContext.Current.Session[PerSessionObjectID];
        }

        public override void Dispose()
        {
        }
    }

Но я хочу написать что-то вроде

 cr => cr.LifeStyle.PerSession.Named(cr.Implementation.Name)

Я использую Castle Windsor 3.0 и обнаружил, что перечисление LifestyleTypeсодержится в пространстве имен Castle.Core, оно используется DefaultKernel.Мое предложение состоит в том, чтобы переопределить DefaultKernel, но я действительно не знаю, как сделать это без ошибок и, казалось бы, как будто PerSession образ жизни, если поставляется с DLL.

1 Ответ

2 голосов
/ 05 октября 2011

Итак, есть две вещи, о которых вы спрашиваете.

Во-первых, как реализовать образ жизни.Хорошей отправной точкой было бы посмотреть, как реализован стиль жизни каждого веб-запроса (используйте стиль жизни Scoped с настраиваемой областью действия и средством доступа к области действия)

Во-вторых, как это реализовать в API.я рекомендую иметь метод расширения, который инкапсулирует ваш вызов более низкого уровня в LifestyleScoped<YourCustomScopeAccessor>() с LifestylePerSession(), аналогично тому, как WCF Facility делает это .

...