为Windsor Container增添新的定制生活方式

时间:2011-10-05 08:48:11

标签: c# .net castle-windsor

我想在ASP.NET MVC应用程序中为我的一个控制器添加每个会话的生活方式,但它目前没有这样的选项。我搜索了stackoverflow并找到了下一个解决方案

    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,但我真的不知道怎么做它是无错误的,如果Perseession的生活方式如果与dll一起出售,那就好了。

1 个答案:

答案 0 :(得分:2)

所以你要问的有两件事。

首先是如何实现生活方式。好的起点是看看每个网络请求的生活方式是如何实现的(使用带有自定义范围和范围访问者的Scoped生活方式)

其次,如何在API中表现出来。我建议使用一种扩展方法,将LifestyleScoped<YourCustomScopeAccessor>()的较低级别调用封装为LifestylePerSession(),类似于WCF Facility does it