![](/img/trans.png)
[英]services.Configure<>() or services.AddSingleton().Get()?
[英]services.AddSingleton, service's constructor is never called
tl; dr
services.AddSingleton<ISomeService, SomeService>();
// SomeService not instantiated nor initialized?
在经典SignalR Chat应用的一个变体中,我监视对SQL Server表的更改,并通过SignalR实时报告它们。 观看此视频 10秒钟,以了解创意。 我的代码改编自该项目 。 聊天部分工作正常。
对SQL Server表的更改应该由SqlDependencyService
类监视。 但是, 它的构造函数从不调用 ,因此应该在该处获得对SignalR集线器的引用。
这是我的Startup.ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddSignalR();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
// No instantiation ?!?
services.AddSingleton<IDatabaseChangeNotificationService, SqlDependencyService>();
// My lame attempt at forcing instantiation:
SqlDependencyService sqlDS = serviceProvider.GetService<SqlDependencyService>();
//sqlDS.Config(); // Fails, sqlDS is null.
}
这是我的SqlDependencyService类的一部分:
public class SqlDependencyService : IDatabaseChangeNotificationService
{
private readonly IConfiguration configuration;
private readonly IHubContext<ChatHub> chatHub;
// Never gets called!
public SqlDependencyService(IConfiguration configuration, IHubContext<ChatHub> chatHub)
{
this.configuration = configuration;
this.chatHub = chatHub;
}
// Never gets called!
public void Config()
{
SubscribeToPersonTableChanges();
}
private void SubscribeToPersonTableChanges()
{
// ...
}
// ...
}
这是服务的界面:
public interface IDatabaseChangeNotificationService
{
void Config();
}
如前所述,构造函数永远不会被调用。 另外,我看不到如何调用Config方法-一些ASP.NET Core约定魔术?
我的HomeController没有这个问题,它的构造函数被调用并传递了IHubContext<ChatHub>
:
public class HomeController : Controller
{
private readonly IHubContext<ChatHub> chatHub;
public HomeController(IHubContext<ChatHub> chatHub)
{
this.chatHub = chatHub;
}
// ...
}
仅仅添加一个服务就不会导致它被实例化,实际上您需要将其注入到容器中以调用它的构造函数。 看起来您希望该服务在启动时可用,因此我建议在启动时使用Configure
方法:
public void Configure(IApplicationBuilder app, IDatabaseChangeNotificationService dbService)
{
dbService.Config();
//snip
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.