可以安全地使用nancy模块属性作为每个请求'存储?

时间:2015-04-09 03:02:47

标签: asp.net nancy

除了一般来说是一个糟糕的,坏的模式之外,还有什么后果可以做这样的事情来将对象作为nancy模块中的属性存储在请求的生命周期中?一切看起来还不错,但不确定这是否会导致任何规模的怪异......即请求之间的串扰,内存泄漏,一般的恶作剧。

public class APIModule : NancyModule 
{
    public SomeConvolutedThing MyThing { get; set; }

    public APIModule()
    {
        Before += ctx => {
                try
                {
                    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(HttpContext.Current.Request.Cookies["MyThing"].Value);
                    MyThing = JsonConvert.DeserializeObject<SomeConvolutedThing>(ticket.UserData);
                }
                catch
                {
                    MyThing = null;
                }             

            return null;
        };

        Get["/api/callit"] = parameters => {
         // check on status of MyThing before deciding what to return
        };
    }

}

2 个答案:

答案 0 :(得分:1)

你应该没问题,按照请求构造模块 - 虽然不需要使用before钩子,只需将代码粘贴在构造函数的开头,就好像从构造函数参数设置属性一样

答案 1 :(得分:1)

正如@StevenRobbins所说,你可以,但问题是 - 为什么?对于你提供的剪切,在构造函数中使用局部变量就足够了。

我可以设想其他几个理由想要这个:

  1. 您的路线使用私人方法进行工作。然后私有只读字段将起作用(出于同样的原因,每个模块按照请求构造)。或者甚至更好,使这些私有函数接受myThing作为参数,并仍在ctor中使用local var。

  2. 您希望在模块外部访问它 - 最好创建自己的类以将其保存在模块外部。注册它&#34;按要求&#34;并有一个beforerequest钩子来填充数据,并注入其他任何需要它的功能。

  3. 详细说明(2):

    public interface IMyThingBag
    {
        MyThing MyThing{get;set;}
    }
    
    public class MyBagFiller : IRequestStartup
    {
        private readonly IMyThingBag _bag;
        public MyBagFiller(IMyThingBag bad)
        {
            _bad = bag;
        }
    
        public void Initialize(IPipelines pipelines, NancyContext context)
        {
            _bag.MyThing = new MyThing{.....};
        }
    }
    

    现在,在链中的任何地方(需要按照请求注册部件),你可以注入袋子并使用东西:)

    如果您需要数据,甚至可以将其注入模块中。