当前位置: 首页 > news >正文

国内建设地铁的公司网站/谷歌搜索引擎为什么国内用不了

国内建设地铁的公司网站,谷歌搜索引擎为什么国内用不了,荆楚网微信公众平台下载,企业做网站被骗背景 C#,Ninject,定期执行某计划任务。首先想到的是使用 Quartz 来安排计划任务,于是看是否有相应的集成。果然有:https://github.com/dtinteractive/Ninject.Extensions.Quartz/。该项目提供了一个 NinjectJobFactory&#xff0c…

背景

C#,Ninject,定期执行某计划任务。首先想到的是使用 Quartz 来安排计划任务,于是看是否有相应的集成。果然有:https://github.com/dtinteractive/Ninject.Extensions.Quartz/。该项目提供了一个 NinjectJobFactory,用来创建 Job,代码很简单,就是从 Ninject 的 Kernel 里去 Resolve Job:

Code
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{IJobDetail jobDetail = bundle.JobDetail;Type jobType = jobDetail.JobType;try{if (log.IsDebugEnabled){log.Debug(string.Format(CultureInfo.InvariantCulture, "Producing instance of Job '{0}', class={1}", jobDetail.Key, jobType.FullName));}return _kernel.Get(jobType) as IJob;}catch (Exception e){SchedulerException se = new SchedulerException(string.Format(CultureInfo.InvariantCulture, "Problem instantiating class '{0}'", jobDetail.JobType.FullName), e);throw se;}
}

该项目还提供了一个可选的 IScheduler 的默认单例实现:

Bind<IScheduler>().ToMethod(ctx => ctx.Kernel.Get<ISchedulerfactory>().GetScheduler()).InSingletonScope(); 

挑战

看起来很顺利,使用这个默认的 IScheduler 的实现去 Trigger Job 就 OK 了。但是在实际使用发现一个问题,那就是创建出来的 Job 如果实现了 IDisposable 接口是不会被显式 Dispose 的。解决方案有两个,一个是在 NinjectJobFactory 里实现 ReturnJob 方法,在该方法里尝试 Dispose Job。第二个办法是使用 JobListener,在 JobWasExecuted 里 Dispose Job。

之所以 Job 需要实现 IDisposable 接口,是因为其依赖项实现了 IDisposable 接口,需要在 Job 执行结束之后 Dispose 。在 Job 的 Dispose 方法里 Dispose 依赖项,看起来是再正确不过的做法了。但是考虑一下 ASP.NET MVC 的 Controller ,我们并没有在 Controller 里重写 Dispose 方法,去 Dispose 依赖项,那么,这些依赖项是如何被及时 Dispose 的呢?

答案在 Ninject.Web.Common 里,这里有一个 OnePerRequestHttpModule,这个 HttpModule 会注册一个 EndRequest 事件,并在该事件里 Clear 掉所有 Scope 为 HttpContext.Current 的实例。

var context = HttpContext.Current;
this.MapKernels(kernel => kernel.Components.Get().Clear(context));

凡是定义为InRequestScope的依赖项,都会在这里被Dispose。

这个跟我们 Quartz Job 的 case 很像,但是 Quartz 没有一个 CurrentJob 的静态变量。怎么来定义一个 Job Scope 呢?

方案

通过阅读 Ninject 文档,我发现 Ninject.Web.Common 预留了一个 INinjectHttpApplicationPlugin 接口,并可以与 Ninject.Extension.NamedScope 整合,实现自定义的 InRequestScope。

INinjectHttpApplicationPlugin 接口主要定义了三个方法:Start,Stop 和 GetRequestScope。Start,Stop 分别对应启动和停止插件,而 GetRequestScope 则用来获取对应 InRequestScope 的依赖项的 Scope。

NamedScope extension 可以 Define 一个命名的、自定义的 Scope;而依赖项的生命周期可以定义为该 Scope 内。

这两者结合刚好符合我们的需求。

首先实现 INinjectHttpApplicationPlugin 接口,在 Start 的时候,绑定所有 IJob 的实现,并定义 NamedScope。在 GetRequestScope 的时候,尝试拿到此 NamedScope:

Code
class QuartzPlugin : INinjectHttpApplicationPlugin
{private readonly IKernel kernel;private IScheduler scheduler;public QuartzPlugin(IKernel kernel){this.kernel = kernel;}public override void Start(){this.kernel.Bind(x => x.FromThisAssembly().IncludingNonePublicTypes().SelectAllClasses().InheritedFrom().BindToSelf().Configure(c => c.DefinesNamedScope("QuartzJobScope")));this.scheduler = this.kernel.Get<IScheduler>();this.scheduler.ListenerManager.AddJobListener(this.kernel.Get<ReleaseJobListener>());this.scheduler.Start();// schedule jobs to the scheduler.}public override void Stop(){this.scheduler.Shutdown(false);}public override object GetRequestScope(IContext context){return context.TryGetNamedScope("QuartzJobScope");}
}

然后把这个 Plugin 注册到 Ninject 的 Components 里,并声明依赖项的 Scope 为 InRequestScope:

kernel.Components.Add<INinjectHttpApplicationPlugin, QuartzPlugin>();
kernel.Bind<SomeDbContext>().ToSelf().InRequestScope();

最后,启动 Ninject.Web.Common 里的 Bootstrapper 就 OK 了。

转载于:https://www.cnblogs.com/xushuo/p/Ninject_NamedScope_RequestScope_NinjectHttpApplicationPlugin.html

http://www.lbrq.cn/news/1078057.html

相关文章:

  • 广东现在有什么病毒疫情/长沙搜索排名优化公司
  • 网站开发需求描述/网站排行榜前十名
  • 信阳建网站/百度推广营销
  • 网站开发4k分辨率/爱战网关键词
  • 无锡建设机械网站/淘宝引流推广平台
  • 怎么样提升网站权重/专注于网站营销服务
  • 绍兴手机网站制作/百度官方app免费下载
  • 用模板建商城购物网站/营销方案案例
  • wordpress 4.7.5下载/关键词排名优化公司推荐
  • 相城做网站的公司/台州专业关键词优化
  • 邯郸医疗网站建设/seo是什么意思电商
  • 网站性能容量的收集与分析怎么做/发稿平台
  • 做网站的公司 苏迪/东莞网络营销推广软件
  • 住房和城乡建设部科技网站首页/出售网站平台
  • 代充网站怎么做/美国搜索引擎浏览器
  • 自己的服务器如何给网站备案/seo的优化原理
  • 扫码支付个人商城网站开发免费/微信营销软件哪个好用
  • 七牛云wordpress加速/seo优化多少钱
  • 网站后台多附件上传/app推广策略
  • 浙江广厦建设职业技术学院招生网站/杭州网站设计公司
  • 塘沽集团网站建设/郑州手机网站建设
  • pc28预测网站多少做/产品宣传方案
  • 网站建设企业网站界面设计/昆明百度推广优化
  • 电脑做ppt如何插入网站/推广普通话文字内容
  • mvc5 网站开发之美/网站建设公司哪家好?
  • wordpress建站图片效果/磁力蜘蛛
  • 党支部建设网站/软文广告属于什么营销
  • 武汉建网公司网站建设/网站建设公司
  • 做网站价格差异很大/百度推广客户端怎么登陆
  • 腾讯做电脑吃鸡网站/注册网站流程和费用
  • Springboot 配置 doris 连接
  • 如何在 Mac OS 上安装 Cursor
  • Flux.1系列模型解析--Flux.1
  • 设计模式之代理模式
  • Python Day19 时间模块 和 json模块 及例题分析
  • 常见CMS获取webshell的方法-靶场练习