代码之家  ›  专栏  ›  技术社区  ›  Poul Bak

如何避免在不需要时解决服务?

  •  0
  • Poul Bak  · 技术社区  · 3 年前

    我有一个Razor页面,它使用每周运行一次的维护作业服务,如下所示:

    public class IndexModel : PageModel
    {
        public IndexModel(IMyService service)
        {
            myService = service;
        }
    
        private IMyService myService;;
    
        public void OnGet()
        {
            if (DateTime.Now - LastCheck > TimeSpan.FromDays(7))
            {
                IMyService useService = myService; // Use the service
            }
        }
    }
    

    然而,据我所知,该服务是根据每个请求解决的,即使它每周只需要一次。

    这需要花费时间和内存。

    有没有一种方法可以只在使用服务时解决它?

    怎么可能

    2 回复  |  直到 3 年前
        1
  •  2
  •   Ryan.Bartsch    3 年前

    一种选择是将其注册为 Func<MyService> 以便您可以延迟实例化,例如注册:

    services.AddSingleton<Func<MyService>>(_ => () =>
        return (DateTime.Now > TimeSpan.FromDays(7)) ? new MyService() : null);
    

    然后

    public class IndexModel : PageModel
    {
        public IndexModel(Func<MyService> func)
        {
            myService = func.Invoke();
        }
    
        private IMyService myService;
    
        public void OnGet()
        {
            myService?.DoSomething();
        }
    }
    

    另一种选择可以是将其注册为单例,例如。

    services.AddSingleton<IMyService, MyService>();
    
        2
  •  0
  •   fmansour    3 年前

    您可以将其注册为singleton,然后它将只是其中的一项

    解析并不重要(它不会每次都创建一个新的,它只是从某种字典中获取它)

    看看这篇Microsoft文章: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-5.0