我在web api中使用ninject作为依赖项解析器
情境:
我需要生成一份pdf报告,其中包含报告数据和组织地址作为报告标题。
当前实施:
我有2个控制器,即OrganisationController和ReportController。
问题:
在创建pdf时,我访问标题的组织数据。 Pdf生成正确,它也包括组织数据。在我使用组织控制器put方法更新组织数据之后。当我再次创建报告时,它会显示旧的组织数据。
我的嫌疑人:
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
}
我在自定义格式化程序中读到构造函数注入不支持请建议
答案 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();
}