autofac如何确定注入参数的寿命范围
本文关键字:范围 参数 何确定 注入 autofac | 更新日期: 2023-09-27 18:26:45
我在使用Autofac时遇到了一个严重的内存泄漏问题,我想我可能已经解决了。但是,我很好奇在StatsRefreshMessageHandler
类中注入的服务StatsService
是否使用了调用它的Helpers
类的生存期范围。
注册服务
builder.RegisterType<StatsService>().InstancePerLifetimeScope();
我的helpers类注入了一个生存期作用域,然后它调用适当的消息处理程序。在本例中,它将是StatsRefreshMessageHandler
public class Helpers
{
private ILifetimeScope _lifetimeScope;
private ILifetimeScope _lifetimeScope;
public Helpers(ILifetimeScope lifetimeScope)
{
_lifetimeScope = lifetimeScope;
}
public void ProcessMessage<T>(T message) where T : class
{
//Voodoo to construct the right message handler type
Type handlerType = typeof(IMessageHandler<>);
Type[] typeArgs = { message.GetType() };
Type constructed = handlerType.MakeGenericType(typeArgs);
//Handle the message
using (var messageScope = _lifetimeScope.BeginLifetimeScope())
{
var handler = messageScope.Resolve(constructed);
var methodInfo = constructed.GetMethod("Handle");
//this is where it call the message handler
methodInfo.Invoke(handler, new[] { message });
}
}
}
下面的类(StatsRefreshMessageHandler
)使用标准的IOC注入。。。但是,这里的问题是StatsService从哪里解决?我假设它来自调用程序(Helpers
)的生存期范围,但如果它是从根内核解决的,那么我仍然会遇到问题。
public class StatsRefreshMessageHandler : IMessageHandler<StatsRefreshMessage>
{
private readonly StatsService _statsService;
public StatsRefreshMessageHandler(StatsService statsService)
{
_statsService = statsService;
}
public void Handle(StatsRefreshMessage message)
{
_statsService.UpdateStatsCache(DateTime.UtcNow);
Console.WriteLine("DONE STATS");
}
}
有一些关于如何为Autofac站点上的对象确定生存期范围的详细文档。这可能有助于澄清你可能存在的一些问题。
一些快速答案:
- 从
messageScope
解析的handler
将进入其注册的生存期范围:SingleInstance
注册将来自容器,因此稍后可以与其他解析调用共享- CCD_ 10和CCD_ 11将来自CCD_
StatsRefreshMessageHandler
的构造函数中的StatsService
也将来自messageScope
,因为这是解析处理程序(使用者)的地方。它还将遵守如上所述的生存期范围注册(例如,如果StatsService
是SingleInstance
,它将最终在容器中)