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如何确定注入参数的寿命范围

有一些关于如何为Autofac站点上的对象确定生存期范围的详细文档。这可能有助于澄清你可能存在的一些问题。

一些快速答案:

  • messageScope解析的handler将进入其注册的生存期范围:
    • SingleInstance注册将来自容器,因此稍后可以与其他解析调用共享
    • CCD_ 10和CCD_ 11将来自CCD_
  • StatsRefreshMessageHandler的构造函数中的StatsService也将来自messageScope,因为这是解析处理程序(使用者)的地方。它还将遵守如上所述的生存期范围注册(例如,如果StatsServiceSingleInstance,它将最终在容器中)