Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有InRequestScope和InTransientScope,用于将NinObject解析为同一类型_C#_Ninject 2 - Fatal编程技术网

C# 具有InRequestScope和InTransientScope,用于将NinObject解析为同一类型

C# 具有InRequestScope和InTransientScope,用于将NinObject解析为同一类型,c#,ninject-2,C#,Ninject 2,我有一个Ninject设置,它创建了一个JobContext解析器InRequestScope()这很好,但是,我在网站上有一个非常特殊的调用,需要我循环访问几个数据库(数据库中的所有数据按年份)。我无法完全弄清楚到底发生了什么,因为我忘记了JobContext是RequestScope中的,但最后一块代码并没有按照我的想法运行 这是设置 //Ninject module Bind<Data.IJobContext>().To<Data.JobContext>().InR

我有一个Ninject设置,它创建了一个JobContext解析器
InRequestScope()
这很好,但是,我在网站上有一个非常特殊的调用,需要我循环访问几个数据库(数据库中的所有数据按年份)。我无法完全弄清楚到底发生了什么,因为我忘记了JobContext是RequestScope中的
,但最后一块代码并没有按照我的想法运行

这是设置

//Ninject module
Bind<Data.IJobContext>().To<Data.JobContext>().InRequestScope();


//Controller's Initialize
protected override void Initialize(System.Web.Routing.RequestContext requestContext) {
    base.Initialize(requestContext);

    //set a connection string for the jobContext
    this.jobContext = DependencyResolver.Current.GetService<IJobContext>();
    jobContext.SetYear(currentYear);
}

我如何才能做到这一点?

出现的一个问题是,有时您是否真的需要请求范围中的JobContext,而在其他情况下则需要瞬态范围中的JobContext。似乎有一种设计的味道!在执行以下操作之前,请尝试修复此问题

如果您真的想按照您描述的方式进行,那么必须指定两个不同的命名绑定,一个在transient中,一个在request作用域中,并按名称获取它们

this.Bind<IJobContext>().To<JobContext>().InRequestScope().Named("RequestScoped");
this.Bind<IJobContext>().To<JobContext>().InTransientScope().Named("TransientScoped");
kernel.Get<IJobContext>("RequestScoped");
this.Bind().To().InRequestScope().Named(“RequestScope”);
this.Bind().To().InTransientScope().Named(“TransientScope”);
Get(“RequestScoped”);

还有一件事:我会成功地尝试摆脱Ninject内核的ServiceLocator类用法,改用依赖项注入。我会得到一个更好的设计。

嗯,几乎每一页都只需要特定年份的设计。除了在一次调用中,我需要列出每个数据库中的所有记录。我不知道名为的
。虽然我不喜欢这样,但它确实有效。我试图想出另一种方法,但我不知所措我在任何地方都使用依赖项注入,除了这个位置,顺便说一下:)如果您使用InRequestScope,并且发生Db验证错误,您将无法使用请求范围上下文将其保存到数据库中。在这种情况下,您需要一个临时作用域来将特定异常保存到数据库中。这篇文章提供了很多信息:
this.Bind<IJobContext>().To<JobContext>().InRequestScope().Named("RequestScoped");
this.Bind<IJobContext>().To<JobContext>().InTransientScope().Named("TransientScoped");
kernel.Get<IJobContext>("RequestScoped");