除了一般来说是一个糟糕的,坏的模式之外,还有什么后果可以做这样的事情来将对象作为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
};
}
}
答案 0 :(得分:1)
你应该没问题,按照请求构造模块 - 虽然不需要使用before钩子,只需将代码粘贴在构造函数的开头,就好像从构造函数参数设置属性一样
答案 1 :(得分:1)
正如@StevenRobbins所说,你可以,但问题是 - 为什么?对于你提供的剪切,在构造函数中使用局部变量就足够了。
我可以设想其他几个理由想要这个:
您的路线使用私人方法进行工作。然后私有只读字段将起作用(出于同样的原因,每个模块按照请求构造)。或者甚至更好,使这些私有函数接受myThing作为参数,并仍在ctor中使用local var。
您希望在模块外部访问它 - 最好创建自己的类以将其保存在模块外部。注册它&#34;按要求&#34;并有一个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{.....};
}
}
现在,在链中的任何地方(需要按照请求注册部件),你可以注入袋子并使用东西:)
如果您需要数据,甚至可以将其注入模块中。