- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些类库为我创建的应用程序提供服务,并且由于遗留原因,它们与 DryIoc 紧密绑定(bind)。 .也就是说,服务注册是紧密绑定(bind)的,而不是实际的服务。
如果可以的话,我宁愿在没有必要的情况下也不要四处更改代码。
创建新的 ASP.NET MVC Core 应用程序我能够通过更改 ConfigureServices 方法来使用 DryIoc 以返回 IServiceProvider像这样:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddControllersAsServices();
var container = new Container().WithDependencyInjectionAdapter(services);
return container.ConfigureServiceProvider<CompositionRoot>();
}
(这是内存中的,所以可能不是 100% 正确,但这并不重要)
重要的变化是 void
方法可以更改为返回 IServiceProvider
,这DryIoc
可以提供给我。
但是,对于 HostBuilder
,我想将其用于控制台应用程序、后台服务等。配置服务的方法不接受 IServiceProvider
所以我不确定该怎么做。
重要的代码是这样的:
var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) => { ... })
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
// configure services
})
.ConfigureLogging((hostingContext, logging) => { ... });
ConfigureServices
上面的方法有一个重载和一个扩展方法:
ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)
ConfigureServices(this IHostBuilder hostBuilder, Action<IServiceCollection> configureDelegate)
似乎没有关于返回或使用 IServiceProvider
的任何规定。或任何其他 DryIoc
可以为我提供这方面的帮助。
这可能吗?有没有办法弥合差距?或者我只需要切换到使用 Microsoft IServiceCollection
对于我的类(class)图书馆?由于它们在许多项目中都在使用,我宁愿不更改,只是因为在这个特定实例中它看起来最简单,但如果我必须这样做,我必须这样做。
最佳答案
@Nkosi 提供了一个不正确的答案(但在 ASP.NET 应用程序的上下文中是正确的) ,评论线程引发了关于方法 UseServiceProviderFactory
的讨论,结果证明是解决方案,所以谢谢你们。
要使用 UseServiceProviderFactory
,我必须自己实现一个类,并将适当的 nuget 包引用添加到我的项目中。
步骤如下:
DryIoc.dll
的引用(不出所料)DryIoc.Microsoft.DependencyInjection
的引用UseServiceProviderFactory
所需框架的自定义实现原始代码如下所示:
var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) => { ... })
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
// configure services
})
.ConfigureLogging((hostingContext, logging) => { ... });
这里是使用的东西:
var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) => { ... })
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
// configure services
})
//////////////////// ADD THIS vvvvvvvv
.UseServiceProviderFactory(new DryIocServiceProviderFactory())
.ConfigureContainer<Container>((hostContext, container) =>
{
container.Register<...>();
})
//////////////////// ADD THIS ^^^^^^^^
.ConfigureLogging((hostingContext, logging) => { ... });
然后提供 DryIocServiceProviderFactory
的实现:
internal class DryIocServiceProviderFactory : IServiceProviderFactory<IContainer>
{
public IContainer CreateBuilder(IServiceCollection services)
=> new Container().WithDependencyInjectionAdapter(services);
public IServiceProvider CreateServiceProvider(IContainer containerBuilder)
=> containerBuilder.ConfigureServiceProvider<CompositionRoot>();
}
上面的CompositionRoot
类在配置期间解析,构造函数可用于配置容器。可以使用什么都不做的虚拟类。
关于c# - 将 HostBuilder.ConfigureServices 与 DryIoc 容器一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51872490/
所以我一直在尝试以 JWT 分发的形式设置一个带有 token 身份验证的小型测试 api, token 分发部分按预期工作。 然而,由于我想让我的 JWT 服务的方法更通用,以允许对 token 进
如果一个类有两个构造函数,当我在 ConfigureServices 中注册该服务时,服务容器如何选择使用哪一个? 所以假设我有一个名为 MyClass 的类(class)有对应的接口(interfa
我正在使用 Auth0 的 SDK 进行身份验证,并在他们的 sample code 中使用,他们在 ConfigureServices() 中创建了一个事件监听器,例如 OnRedirectToId
您将如何从 configureServices 内部访问配置Giraffe-FSharp 中的方法? 这是 SAFE template 创建的 Giraffe 设置的节选部分通过 dotnet new
我在 Startup.cs 中有类似的代码 services.Configure( Configuration.GetSection("AppSettings")); services.Add
我想在 ConfigureServices 中注册一个通用类(需要这个类,因为我想实现模式:存储库和工作单元)以获得依赖注入(inject)。但是我不知道怎么办。 这是我的界面: public int
关注点分离 (SoC) ConfigureServices 中注册的依赖指令(启动类的方法)由不同的 DI 组成,如 Repository、Fluent Validations 等。 我将如何将 DI
我要配置 ASP.NET Core Identity基于驻留在数据库中的设置而不是 AppSetting.json或硬编码值。因此,我很想在方法 ConfigureServices(IServiceC
在我的 ConfigureServices 方法中,我想读取一个文件(在我的例子中是一个用于签署 token 的证书,但它可以是设置服务所需的任何文件)。因此,我需要知道 IApplicationEn
在 ConfigureServices 方法中一次添加 httpContextAccessor 与为每个 HttpClient 配置添加 HttpContextAccessor 之间有什么区别。 pu
我创建了一个记录器,它应该在应用程序运行启动期间记录任何内容。我希望它在 Startup 和 ConfigureServices 之间持续存在。我将它存储在类似于配置的属性中 这是代码 public
我创建了一个记录器,它应该在应用程序运行启动期间记录任何内容。我希望它在 Startup 和 ConfigureServices 之间持续存在。我将它存储在类似于配置的属性中 这是代码 public
我有一个 .Net Core 项目,它注册了一些单例,如下所示: public void ConfigureServices(IServiceCollection services) { se
有时,在服务注册期间,我需要从 DI 容器解析其他(已经注册的)服务。对于像 Autofac 或 DryIoc 这样的容器,这没什么大不了的,因为您可以在一行上注册服务,在下一行上您可以立即解决它。
在我的 ASP.Net Core 应用程序中,我需要在 ConfigureServices 方法中注入(inject)一些依赖项(在我的例子中是一个存储库)。 问题是该方法不允许使用多个参数来注入(i
自 2018 年 5 月 30 日起,我在 Startup.cs 中的 ASP.NET Core 代码 public IServiceProvider ConfigureServices(IServi
我需要在 ASP core 3.0 中使用这个 AutoFac 当我在启动时使用这段代码: public IServiceProvider ConfigureServices(IServiceColl
是否可以解析 IOptions 的实例?来自 ConfigureServices启动时的方法? The documentation explicitly says : Don't use IOptio
我通常会做以下事情 static void Main() { IConfiguration config = new ConfigurationBuilder()
我有一个 ASP.NET Core 3 应用程序,并且正在使用 AzureAD 进行身份验证。我的 Startup.ConfigureSerivces 方法中有以下几行,其目的是在附加 cookie
我是一名优秀的程序员,十分优秀!