为什么 StructureMap 容器不 return 控件然后调用 GetInstance?
Why StructureMap container doesn't return the control then calling GetInstance?
我注册了以下服务:
For<Internal.FullPdfExporter>().Use<Internal.FullPdfExporter>();
我有一个出口商工厂来创建不同的出口商。首先将 StructureMap 容器注入到这个工厂:
private readonly IContainer _container;
public ExporterFactory(IContainer container)
{
_container = container;
}
然后我使用以下代码获取 FullPdfExporter 的实例:
private IExporterBase CreateInstance(Type exporterType)
{
return _container.GetInstance(exporterType) as IExporterBase ;
}
但是这段代码根本 return 无法控制。这里有什么问题?
我尝试在调试中检查所有已注册的实例,并注意到容器已注册“Internal.FullPdfExporter”。
注意:internal是命名空间的别名;
我如何从工厂获取导出器(从 Http 控制器调用的业务服务代码):
var task = Task.Run(async () =>
{
foreach (var item in exportData.OrderBy(x => x.ExportUid))
{
var exporter = _exporterFactory.GetBookExporter(param1, param2);
await exporter.StartExport(item.ExportUid);
if (!exporter.IsCompletedSuccessfully)
{
break;
}
}
});
return response;
注意: 如果在 task.Run 之前放置 _exporterFactory.GetBookExporter 调用,一切正常。容器能够解决依赖关系。
GetBookExporter 方法的代码:
public IExporterBase GetBookExporter(BookSchema bookSchema, PublishProfileType publishProfileType)
{
return CreateInstance(typeof(Internal.FullPdfExporter));
}
您的一般逻辑有问题。即使在您的 http 调用已经结束后,您仍希望事情 运行。
一旦您 return 做出响应,ASP.NET 框架中就会发生一些事情。
依赖注入容器完成它们的范围,对象被释放。
在调用完成之前保留那些本质上可能是范围内或瞬态的引用是行不通的。诚然,有时它可能会工作,当你有 类 没有实现 IDisposable
或者你只是幸运地获得了微秒计时,但一般来说,这不是预期的,也不意味着工作。
如果你想在回复后做工作,你必须把这个工作交给另一方。也许您将它保存到数据库中,然后另一个服务将其拾取并对其进行处理。或者你可能有另一个程序或线程 运行ning 并且你尝试了一些 IPC。但是你不应该期望线程或任务引用你的 http 调用范围内的东西在它完成后工作。
我注册了以下服务:
For<Internal.FullPdfExporter>().Use<Internal.FullPdfExporter>();
我有一个出口商工厂来创建不同的出口商。首先将 StructureMap 容器注入到这个工厂:
private readonly IContainer _container;
public ExporterFactory(IContainer container)
{
_container = container;
}
然后我使用以下代码获取 FullPdfExporter 的实例:
private IExporterBase CreateInstance(Type exporterType)
{
return _container.GetInstance(exporterType) as IExporterBase ;
}
但是这段代码根本 return 无法控制。这里有什么问题?
我尝试在调试中检查所有已注册的实例,并注意到容器已注册“Internal.FullPdfExporter”。
注意:internal是命名空间的别名;
我如何从工厂获取导出器(从 Http 控制器调用的业务服务代码):
var task = Task.Run(async () =>
{
foreach (var item in exportData.OrderBy(x => x.ExportUid))
{
var exporter = _exporterFactory.GetBookExporter(param1, param2);
await exporter.StartExport(item.ExportUid);
if (!exporter.IsCompletedSuccessfully)
{
break;
}
}
});
return response;
注意: 如果在 task.Run 之前放置 _exporterFactory.GetBookExporter 调用,一切正常。容器能够解决依赖关系。
GetBookExporter 方法的代码:
public IExporterBase GetBookExporter(BookSchema bookSchema, PublishProfileType publishProfileType)
{
return CreateInstance(typeof(Internal.FullPdfExporter));
}
您的一般逻辑有问题。即使在您的 http 调用已经结束后,您仍希望事情 运行。
一旦您 return 做出响应,ASP.NET 框架中就会发生一些事情。
依赖注入容器完成它们的范围,对象被释放。
在调用完成之前保留那些本质上可能是范围内或瞬态的引用是行不通的。诚然,有时它可能会工作,当你有 类 没有实现 IDisposable
或者你只是幸运地获得了微秒计时,但一般来说,这不是预期的,也不意味着工作。
如果你想在回复后做工作,你必须把这个工作交给另一方。也许您将它保存到数据库中,然后另一个服务将其拾取并对其进行处理。或者你可能有另一个程序或线程 运行ning 并且你尝试了一些 IPC。但是你不应该期望线程或任务引用你的 http 调用范围内的东西在它完成后工作。