数据未更新 - WebAPI中的Ninject范围

时间:2017-09-09 10:07:24

标签: c# asp.net-web-api ninject-extensions

我在web api中使用ninject作为依赖项解析器

情境:

我需要生成一份pdf报告,其中包含报告数据和组织地址作为报告标题。

当前实施:

我有2个控制器,即OrganisationController和ReportController。

  • 组织控制器具有组织的CRUD操作。
  • 报表控制器已获取基于获取报表详细信息的方法 ID。在这里它接受application / json和application / pdf作为Accept 头
  • 对于pdf,我创建了自定义PDF Formater并实现了pdf MigraDoc工具。

问题:

在创建pdf时,我访问标题的组织数据。 Pdf生成正确,它也包括组织数据。在我使用组织控制器put方法更新组织数据之后。当我再次创建报告时,它会显示旧的组织数据。

我的嫌疑人:

  • Report1构造函数只调用一次。所以organisationLogic没有 重新初始化。这可能是由于错误的处理或指示范围造成的。

mycode的:

ninject注册码:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IOrganisationDetailLogic>().To<OrganisationDetailLogic>();
        kernel.Bind<IOrganisationDetailRepository>().To<OrganisationDetailRepository>();

        kernel.Bind<IReport>().To<Report1>();
        kernel.Bind<PdfMediaTypeFormatter>().ToSelf();

    }

报告类:

public class Report1 : IReport
{
    private readonly IOrganisationDetailLogic _organisationLogic;
    public Report1(IOrganisationDetailLogic organisationLogic)
    {
        _organisationLogic = organisationLogic;
    }
    public async Task<MemoryStream> Create(object model)
    {
        MemoryStream stream = null;

        Document document = new Document();

            //Report Header
            SetHeader(section);

          //Report Data here


            //Footer
            SetFooter(section);

            //Render as PDF

        return stream;
    }

    private void SetHeader(Section section)
    {
       //Here we are getting organisation data
        var organisationDetail = _organisationLogic.GetActiveOrganisations().First();

    }
}

请帮助我错过的地方。当我在SetHeader中启动_organisationLogic时,它的工作正确

更新 我正在添加自定义格式化程序类。

public class PdfMediaTypeFormatter : MediaTypeFormatter
    {
        private readonly string mediaType = "application/pdf";
        Func<Type, bool> typeisIPdf = (type) => typeof(IPdf).IsAssignableFrom(type);
        Func<Type, bool> typeisIPdfCollection = (type) => typeof(IEnumerable<IPdf>).
        IsAssignableFrom(type);
        private readonly IReport _report;

        public PdfMediaTypeFormatter(IReport report)
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue(mediaType));
            MediaTypeMappings.Add(new UriPathExtensionMapping("pdf", new MediaTypeHeaderValue(mediaType)));
            this._report = report;
        }

        public async override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
        {
            var memoryStream = await _report.Create(value);

            var bytes = memoryStream.ToArray();
            await writeStream.WriteAsync(bytes, 0, bytes.Length);
        }

//other methods skipped
   }

我在自定义格式化程序中读到构造函数注入不支持请建议

1 个答案:

答案 0 :(得分:0)

我怀疑范围是造成问题的原因。尝试将.InRequestScope()添加到相关注册中,以确保每个请求都创建一个新实例。

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IOrganisationDetailLogic>().To<OrganisationDetailLogic>().InRequestScope();
    kernel.Bind<IOrganisationDetailRepository>().To<OrganisationDetailRepository>().InRequestScope();

    kernel.Bind<IReport>().To<Report1>();
    kernel.Bind<PdfMediaTypeFormatter>().ToSelf();

}