C# 为温莎集装箱添加新的定制生活方式

C# 为温莎集装箱添加新的定制生活方式,c#,.net,castle-windsor,C#,.net,Castle Windsor,我想在ASP.NET MVC应用程序中为我的一个控制器添加每会话的生活方式,但它当前没有这样的选项。我已经搜索了stackoverflow并找到了下一个解决方案 public class PerSessionLifestyleManager : AbstractLifestyleManager { private readonly string PerSessionObjectID = "PerSessionLifestyleManager_" + Guid.Ne

我想在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,发现Lifestyle类型枚举包含在Castle.Core名称空间中,它正被DefaultKernel使用。我的建议是覆盖DefaultKernel,但我真的不知道如何做到它没有bug,看起来就像是dll附带的PerSession lifestyle一样。因此,有两件事你要问

首先是如何实施生活方式。一个好的起点是了解如何实现每个web请求的生活方式(使用具有自定义作用域和作用域访问器的作用域生活方式)


第二,如何在API中表现出这一点。我建议使用一种扩展方法,将对
LifestyleScoped()
的较低级别调用封装为
LifestylePerSession()
,类似于WCF Facility的方式。

第一种方法似乎是在问题中发布的类中实现的。但是我不确定我是否完全接受你的第二个建议。哦,你发布的生活方式实现是有缺陷的,主要是因为它永远不会释放对象。我觉得有足够多的网页具有相应的工作流。对于这些页面,拥有会话生活方式是很自然的。所以我的最后一个问题是-为什么这没有在Castle中实现?不这样做有什么原因吗?似乎没有人需要它,也没有人关心它的实施。通常,最好是每个web请求组件从持久性存储中获取共享状态,而不是将内存与那些通常会不必要地占用它的大型对象混在一起。我认为这是一个很差的实践,但是如果应用程序是Intranet,会话对象是合理的小,那么持久存储可能是一个过压。