安全使用南希模块属性为“每个请求的存储?(Safe to use a nancy module pr

2019-10-22 13:43发布

除了作为一般坏,坏的模式,有没有做这样的事情来存储一个对象作为南希模块请求的生命在财产的任何后果? 一切看起来不错,但不知道这是否会导致任何古怪的规模......即请求,内存泄漏,一般有心计之间的串扰。

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
        };
    }

}

Answer 1:

作为@StevenRobbins说,你可以,但问题是 - 为什么? 对于剪断你提供,使用局部变量在构造函数仅仅是不够的。

我可以设想其他一些原因,希望有这样的:

  1. 您的路线(S)使用一个专用的方法来做好自己的工作。 然后私人只读字段将工作(由于同样的原因,每个模块每个请求构造)。 甚至更好,让这些私有函数接受myThing作为参数,并仍然使用本地变量的构造函数。

  2. 你要访问此模块之外 - 这是更好地创建自己的类来保存该模块外。 注册为“每个请求”,并有beforerequest钩填充数据,并注入到任何其他功能需要它。

为了详细说明(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{.....};
    }
}

现在,在链中的任何(需要有每个请求注册的部分),你可以注入袋子,用的东西:)

你甚至可以把它注射在模块中,如果你需要的数据在那里。



Answer 2:

你应该罚款这样做,模块,每个请求构造 - 应该没有必要前的钩使用,虽然,只是坚持在构造函数的启动代码,如果你想从一个构造函数的参数设置属性时。



文章来源: Safe to use a nancy module property as 'per-request' storage?
标签: asp.net nancy