- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
tl;博士
services.AddSingleton<ISomeService, SomeService>();
// SomeService not instantiated nor initialized?
在经典 SignalR Chat 应用程序的变体中,我正在监视对 SQL Server 表的更改并通过 SignalR 实时报告它们。 watch this video花 10 秒钟来理解这个想法。我的代码改编自 this project .聊天部分工作正常。
对 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;
}
// ...
}
最佳答案
只是添加一个服务不会导致它被实例化,你实际上需要将它注入(inject)到容器中以调用它的构造函数。看起来你希望服务在启动时可用,所以我建议使用 Configure
启动方法:
public void Configure(IApplicationBuilder app, IDatabaseChangeNotificationService dbService)
{
dbService.Config();
//snip
}
关于c# - services.AddSingleton,永远不会调用服务的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56408358/
我添加了一个这样的单例。 在 Startup.cs 中,我添加了以下内容: services.AddSingleton(); 我想像这样构建我的单例(当然这是不可能的): public class M
tl;博士 services.AddSingleton(); // SomeService not instantiated nor initialized? 在经典 SignalR Chat 应用程
当为使用 AddScoped 或 AddSingleton 添加的服务使用 DI 时,该服务是否需要实现 IDisposable(即使它没有使用任何非托管资源(如文件)? 从 Microsoft Do
我想模拟 IServiceCollection 以使用 Nsubstite 模拟库和 检查是否使用特定接口(interface)和具体类型调用了 AddSingleton xUnit. 这是我的单元测
为什么我应该为我的存储库或服务使用 AddScoped()?为什么不是 AddSingleton()?我知道它们之间的区别,但不明白为什么我不应该使用单例实例来避免为每个请求创建新对象。你能解释一下吗
为什么我应该为我的存储库或服务使用 AddScoped()?为什么不是 AddSingleton()?我知道它们之间的区别,但不明白为什么我不应该使用单例实例来避免为每个请求创建新对象。你能解释一下吗
考虑以下简单的 appsettings.json: { "maintenanceMode": true } 它加载在我的 Startup.cs/Configure(...) 方法中 public
我一直在通过程序类将我的依赖项注册到我的 IOC 容器中,但它变得困惑了。我决定编写一个 DI 提供程序,在其中提供并注册依赖项。 在我开始解释代码之前,这是 VS 给出的完整编译错误。 'Servi
我注意到在一些 .NET Core 示例中有对 TryAddSingleton 的调用,在一些 AddSingleton 中注册服务时。 如果服务类型尚未注册,反编译器显示 TryAdd(由 TryA
我想实现 dependency injection ASP.NET Core 中的 (DI)。因此,将此代码添加到 ConfigureServices 方法后,两种方式都有效。 ASP.NET Cor
在 asp.net 核心应用程序中,我有一个依赖注入(inject)缓存服务,它本质上是内置 MemoryCache 的包装器。 这是被缓存的示例类,它包含 Web 应用程序始终使用的一些枚举的列表:
众所周知,在 ASP.NET Core 2 中有两种获取选项类的方法: 使用 services.Configure<>()像这样: services.AddOption(); services.Con
我正在学习如何将 MongoDB 与 C# ASP.NET 一起使用,并且我一直在遵循 Microsoft 关于使用 MongoDB 的指南 Mongo Doc Guide .我已经进入添加配置模型部
我正在学习如何将 MongoDB 与 C# ASP.NET 一起使用,并且我一直在遵循 Microsoft 关于使用 MongoDB 的指南 Mongo Doc Guide .我已经进入添加配置模型部
看完this帖子我可以理解 AddTransient、AddScoped 和 AddSingleton 之间的区别,但是,我看不到它们每个的实际用法。 我的理解是 添加 transient 每次客户端
我只需添加以下内容即可访问 .NET Core 2 Web API Controller 中的 appsettings.json: public class MyController : Contro
在 ASP.NET Core 2.1 中注册自定义托管服务的正确方法是什么?例如,我有一个派生自 BackgroundService 的自定义托管服务名为 MyHostedService。我该如何注册
我正在使用 StackExchange.Redis 添加到 .NET Core 的 Redis 连接,它目前看起来像这样: public static IServiceCollection AddRe
我是一名优秀的程序员,十分优秀!