问题标签 [microsoft.extensions.hosting]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 将 HostBuilder.ConfigureServices 与 DryIoc 容器一起使用?
我有一些类库为我创建的应用程序提供服务,并且由于遗留原因,它们与DryIoc紧密绑定。也就是说,服务注册是紧密绑定的,而不是实际的服务。
如果可以的话,我宁愿不要只是在不需要时更改该代码。
创建一个新的 ASP.NET MVC Core 应用程序我能够通过更改 ConfigureServices 方法来使用 DryIoc 以返回一个IServiceProvider,如下所示:
(这是来自记忆,所以可能不是 100% 正确,但这并不重要)
重要的变化是该void
方法可以更改为返回一个IServiceProvider
,这DryIoc
可以为我提供。
但是,HostBuilder
我想将它用于控制台应用程序、后台服务等,配置服务的方法不接受IServiceProvider
,所以我不知道该怎么做。
重要的代码是这样的:
上面的ConfigureServices
方法有一个重载和一个扩展方法:
ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)
ConfigureServices(this IHostBuilder hostBuilder, Action<IServiceCollection> configureDelegate)
在这方面,似乎没有任何条款可以返回或使用 aIServiceProvider
或任何其他DryIoc
可以为我提供的东西。
这可能吗?有没有办法弥合差距?还是我只需要切换到使用 MicrosoftIServiceCollection
作为我的类库?由于它们在许多项目中都被使用,我宁愿不要仅仅因为在这个特定情况下它看起来最简单而改变,但如果我必须这样做,我必须这样做。
c# - .NET Core 2.x 中与 HostBuilder 的简单注入器集成
我们正在开发一个运行 .net core 2.x 的 Windows 服务。在 Steve Gordon 的这篇博客文章之后,将 .netcore 通用主机应用程序作为服务运行,事情似乎运行良好……只要我们使用IServiceCollection
. 我更喜欢 SimpleInjector,但我不确定如何像在 asp.net 核心中那样使用它。我有一种方法可以替换内置 DI,如此处所述默认服务容器替换,我知道 SI 团队不推荐ASP.NET Core MVC 集成指南的方法,所以在这个用例中有更好的方法吗?
这是我到目前为止所拥有的,但它不舒服
--主程序
在此处配置容器或多或少可以工作,但由主机创建的第一个类(即Runner
在这种情况下)由主机创建并通过 IServicesCollection 注入任何依赖项。所以我的问题是如何让它从我的 SI 容器中注入?
c# - “Microsoft.Extensions.DependencyInjection”和每个环境的不同具体
“Microsoft.Extensions.DependencyInjection”
使用 DotNet (Framework/Classic) 4.6 或更高版本(又名“过去”,我使用带有 xml 配置的“Unity” 。https://blogs.msdn.microsoft.com/miah/2009/04/03/testing-你的统一xml配置/
(过去在使用“Unity”IoC/DI 的 Dot Net 核心之前)...当我需要一个特定于环境的混凝土时,我会调整 .xml 上的混凝土。例如,假设我的 webApi 需要在生产、uat、qa 和 dev-shared 中进行身份验证。但是在 dev-local 中,我不想在开发 webApi 时一直处理身份验证,我会有 2 个具体的。
我会“注册”其中一个..使用xml。
我的构建过程将更改 unity.xml(准确地说是 unity.config)并更改(通过 msbuild 中的 xml-update-tasks)
MyDevLetEverythingThroughAuthorizer
至
MyRealAuthorizer
.
......
Java Spring具有基于“注释”的:
但这不尊重“复合根”模式:(Mark Seeman http://blog.ploeh.dk/2011/07/28/CompositionRoot/)
…………
所以现在我进入了 DotNetCore 的世界。一切都很顺利。但我终于遇到了一个需要开发友好的混凝土与非开发“真实”混凝土的情况。
Xml 不可用(据我所知)“Microsoft.Extensions.DependencyInjection”。
在这种情况下,我不确定 DotNetCore 的最佳实践。
我更愿意尊重复合根模式。
基本上,以下......但尊重环境。
asp.net'ish
(不是 asp.net)dot.net core'ish 太
附加
这篇文章和 snipplet 帮助我更好地理解“内置内容”部分:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.2
环境 ASP.NET Core 在应用启动时读取环境变量 ASPNETCORE_ENVIRONMENT 并将值存储在 IHostingEnvironment.EnvironmentName 中。您可以将 ASPNETCORE_ENVIRONMENT 设置为任何值,但框架支持三个值:Development、Staging 和 Production。如果未设置 ASPNETCORE_ENVIRONMENT,则默认为生产。
这
env.IsEnvironment("Staging_2") (类似于 env.IsEnvironment("MyCustomValue") )是我猜的技巧。
附加:
这个 SOF 问题让 Asp.Net Core 更加清晰。
如何在发布文件中设置 aspnetcore_environment?
以及无需实际设置(机器)环境变量即可设置环境变量的方法!
c# - 无法在服务中注入 IOptions
我正在尝试在IOptions
我创建的服务内部注入一个,它始终为空:
服务
PS Config 只是一个 POCO,它Program.Main
使用扩展名填充到方法中。UseConfiguration
配置解析正常,所以没有问题。我在构造函数中成功注入了配置Startup
。
c# - c#中如何调用接口方法?
我正在研究 .NET Core。
该CreateHostBuilder
方法返回IHostBuilder
接口并调用该Build
方法。那么是否可以在该接口内实现代码或者它是任何设计模式?
c# - 为什么 GetService 创建的对象没有被破坏?
我正在编写一个针对 dotnet 核心框架 3.1 的应用程序。我使用依赖注入来配置数据库上下文等。在我的 Program.cs 中,我有以下代码:
我host
转到另一个班级。在另一个类中,作为更长方法的一部分,我有以下代码:
这些GC.Collect
电话用于测试/调查目的。在MyHomeContext
I 中,出于测试目的,实现了析构函数和 Dispose() 的覆盖。Dispose() 被调用,但析构函数永远不会被调用。这会导致MyHomeContext
我创建的每个实例都发生内存泄漏。
我错过了什么?我能做些什么来确保MyHomeContext
当我不再需要它的实例时被删除。
由于以下几个原因,我转向了这个工具:
- 我只需要在短时间内建立数据库连接。
- 我插入了大量数据(不是在上面简化的示例/测试代码中),导致 DbContext 保持很大的缓存。我希望处理对象会释放内存,但现在我只会让它变得更糟:(
当我被调用Host.Services.GetService(typeof(MyHomeContext)) as MyHomeContext
的new MyHomeContext()
析构函数替换时。MyHomeContext
在我看来,依赖注入框架中的某些东西持有对该对象的引用。这是真的?如果是这样,我怎么能告诉它释放它?
asp.net-core - .NET Core 3.1 通用主机实现中的 ConfigureContainer
我正在尝试将我们的框架项目迁移到 .NET Core 3.1。作为迁移的一部分,我试图通过 GenericHost 提供的 ConfigureContainer 方法注册模块。这就是我所拥有的:
我的 WorkerServiceDependencyResolver 具有以下内容:
但是当我这样做时,我的应用程序没有运行,它启动时没有任何错误,但没有做任何事情。
但是如果我这样写(这就是我们在 .NET Framework 中的方式):
当我显式构建容器时,一切都按预期工作,但我的理解是我们在 .NET Core 中不需要它?
非常感谢任何输入。
干杯!
.net-core - .NET 通用主机 - 是否可以停止和重新启动主机?
考虑这个没有特殊配置或托管服务的极其简单的 .NET Core 3.1(和 .NET 5)应用程序:
第一次运行(仅出于本测试的目的作为后台触发和忘记任务发送)和停止成功完成。在第二次调用 Run 时,我收到此异常:
System.AggregateException:'对象名称:'EventLogInternal'。无法访问已处置的对象。对象名称:'EventLogInternal'。)'
如果我做同样的事情但使用 StartAsync 而不是 RunAsync(这次不需要 fireAndForget),我会System.OperationCanceledException
第二次收到一个名为 StartAsync 的消息。
我是否可以推断出 .NET 通用主机不应该被停止和重新启动?
为什么我需要这个?
我的目标是让单个应用程序作为 Windows 服务运行,该服务将托管两个不同的 .NET 通用主机。这是基于此处的建议,以便拥有单独的配置和依赖注入规则以及消息队列。
一个将在所有应用程序生命周期内保持活动状态(直到服务在 Windows 服务中停止),并将用作接收消息事件的入口点,该消息事件将启动/停止另一个将是具有完整服务的主要处理主机。这样,主要服务可以处于“空闲”状态,直到它们收到触发其进程的消息,并且另一条消息可以将它们返回到空闲状态。
asp.net-core - IWebHostBuilder.PreferHostingUrls 的目的是什么
我知道文档说什么,但我不知道 IServer 是从哪里引入的或如何配置的。
我的具体情况是我正在调用 IHostBuilder.ConfigureWebHost(而不是 ConfigureWebHostDefaults),尽我所能确定它不会自动包含 Kestrel。我通过 UseHttpSys 使用 HttpSys 而不是使用 Kestrel。
当我同时运行两个本地开发网站时遇到了一个问题。尽管 lauchSettings 文件的每个端口都有不同的端口,但它们都注册了端口 5000。当然,第二个站点收到了一个错误,表明 5000 已在使用中。经过一番摸索,我找到了文档表明端口 5000 是所有东西的默认值,而不仅仅是 Kestrel。(我真的相信在 5.0 之前,只有 Kestrel 默认为 5000。)我通过在我的代码中显式设置一个 URL 来证明默认值,并且它被兑现并且 5000 未被访问。然后,我删除了代码并在 appSettings 文件中设置了“urls”:“http://localhost:6000”,并且很荣幸。此时,我尝试将 true 和 false 作为 PreferHostingUrls 的参数,它们都使用 appSettings 文件中配置的 url,并且在 appSettings 或代码中没有明确的 url 时都失败了。
所以问题的一部分变成了什么是 IServer 以及它是如何引入和配置的。
docker - 无法使用 Serilog 在 Docker 上启动 .NET Core 3.1 Worker 服务
我正在使用 Visual Studio 2019(启用 Docker 支持)编写一个 .Net Core 3.1 Worker Service 应用程序。
如果我使用 Docker 启动应用程序一切正常,但是当我Serilog.AspNetCore 3.4.0
向项目添加依赖项时,我无法再使用 docker 进行调试。
案例:
- 在没有 Serilog 的情况下在本地启动应用程序 --> OK
- 在没有 Serilog 的 Docker 上启动应用程序 --> OK
- 使用 Serilog 在本地启动应用程序 --> OK
- 使用 Serilog 在 Docker 上启动应用程序 --> 错误
Visual Studio 返回的错误是:
这是控制台返回的错误:
编辑:
这是 VS 2019 自动生成的Dockerfile
:
问题是什么,我该如何解决?