代码之家  ›  专栏  ›  技术社区  ›  Buildstarted

同时具有InRequestScope和InTransientScope,用于将Ninject解析为同一类型

  •  1
  • Buildstarted  · 技术社区  · 14 年前

    我有一个创建JobContext解析器的Ninject设置 InRequestScope() 这工作很好,但是,我在网站上有一个非常具体的调用,它要求我循环访问几个数据库(数据库中的所有数据按年份排列)。我不太明白是怎么回事,因为我忘了工作环境是 InRequestScope 但最后一段代码是 按照我的想法行事。

    设置如下

    //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在请求范围内,它每年都会重复使用同一个对象。这是我唯一需要的例子 InTransientScope 而不是 内窥镜 .

    //Special function
    foreach (int year in ActiveYears) {
        jobContext = DependencyResolver.Current.GetService<IJobContext>();
        jobContext.SetYear(year);
        DoSomething();
    }
    

    我怎样才能做到这一点?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Remo Gloor    14 年前

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

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

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

    还有一件事:我会成功地尝试摆脱对Ninject内核的ServiceLocator类型的使用,转而使用依赖注入。我会得到更好的设计。

    推荐文章