如何在LinqPad中让函数及Ninject绑定仅执行一次?
问题1:如何在LINQPad中实现每个进程仅运行一次的函数?
当然可以!LINQPad里有几种可靠的方式来实现这个需求:
- 利用CLR静态构造函数的特性:静态构造函数在整个进程生命周期里只会被调用一次,这是最稳妥的方式。你可以把需要单次执行的逻辑放到静态类的静态构造函数里,然后在脚本开头触发它:
public static class OneTimeRunner { static OneTimeRunner() { // 这里的代码每个进程只会跑一次 Console.WriteLine("我只在进程启动时执行一次!"); } public static void Init() { } // 空方法,用来触发静态构造函数 } // 脚本开头调用,确保逻辑执行 OneTimeRunner.Init();
- 借助LINQPad自带的
Util.Cache:这个缓存是进程级别的,你可以用它存一个标记,判断代码是否已经执行过:
if (!Util.Cache.ContainsKey("ProcessFirstRun")) { // 你的一次性逻辑 Console.WriteLine("进程内仅执行一次"); Util.Cache["ProcessFirstRun"] = true; }
问题2:如何让LINQPad中的Ninject绑定仅执行一次?
这个问题和第一个本质是一样的——我们需要把Ninject的绑定逻辑放到进程生命周期内仅执行一次的代码块里,避免多次运行脚本时重复绑定导致报错。
最推荐的做法是用静态类封装Ninject的初始化:
public static class NinjectBootstrapper { private static IKernel _ninjectKernel; // 静态构造函数,进程内仅执行一次 static NinjectBootstrapper() { _ninjectKernel = new StandardKernel(); // 在这里写所有的绑定逻辑,只会跑一次 _ninjectKernel.Bind<IMyService>().To<MyConcreteService>(); // 其他绑定... } public static IKernel GetKernel() { return _ninjectKernel; } } // 脚本里获取容器的方式: var kernel = NinjectBootstrapper.GetKernel(); var myService = kernel.Get<IMyService>();
为什么这个方法靠谱?因为CLR会保证静态构造函数只执行一次,不管你多少次运行脚本(只要是同一个进程),绑定逻辑都不会重复执行,完美解决重复绑定的问题。
另外提一句:LINQPad默认会复用进程来运行多次脚本,除非你手动开启“每次运行都启动新进程”的选项,所以这种方式正好匹配你的需求,就像MVC里的Application_Start()一样,只在进程启动时初始化一次。
内容的提问来源于stack exchange,提问作者Eterm
相关产品推荐
相关产品推荐

