如何避免在不需要时解决服务?
How can I avoid resolving a service when not needed?
我有一个 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
}
}
}
但是,据我所知,该服务会根据每个请求进行解析,即使它每周只需要一次。
这会耗费时间和内存。
有没有办法只在使用时解析服务?
怎么可以
你可以注册成单例,那么它就是其中的一项
解析并不重要(它不会每次都创建一个新的,它只是从某种字典中获取它)
看看这篇微软文章:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-5.0
一种选择是将其注册为 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>();
我有一个 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
}
}
}
但是,据我所知,该服务会根据每个请求进行解析,即使它每周只需要一次。
这会耗费时间和内存。
有没有办法只在使用时解析服务?
怎么可以
你可以注册成单例,那么它就是其中的一项
解析并不重要(它不会每次都创建一个新的,它只是从某种字典中获取它)
看看这篇微软文章:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-5.0
一种选择是将其注册为 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>();