如何在Wolverine/Lamar的ServiceRegistry中获取IConfiguration实例
在Wolverine的ServiceRegistry子类中获取IConfiguration实例
有两种常用且直接的方式可以实现:
方法一:构造函数注入IConfiguration
直接给自定义ServiceRegistry子类添加接收IConfiguration的构造函数,初始化Registry实例时传入已有的配置对象即可。
示例代码:
// 自定义Registry子类 public class DatabaseRegistry : ServiceRegistry { public DatabaseRegistry(IConfiguration config) { // 直接使用config读取配置项 var dbConnString = config.GetConnectionString("DefaultConnection"); For<IDbConnection>().Use<SqlConnection>() .Ctor<string>("connectionString").Is(dbConnString); } }
在宿主配置中初始化Registry时传入IConfiguration:
var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; builder.Host.UseWolverine(opts => { // 将配置传入自定义Registry opts.Services.AddRegistry(new DatabaseRegistry(configuration)); // 可以添加更多拆分的Registry实例 opts.Services.AddRegistry(new MessagingRegistry(configuration)); });
方法二:通过Lamar的Registry上下文访问(适用于特殊场景)
如果Registry需要在容器构建过程中动态获取配置,可利用Lamar的Registry的ConfigureServices方法,通过IServiceCollection的扩展获取已注册的IConfiguration:
public class MessagingRegistry : ServiceRegistry { public MessagingRegistry() { ConfigureServices(services => { var config = services.BuildServiceProvider().GetRequiredService<IConfiguration>(); var rabbitMqUri = config["RabbitMq:Uri"]; For<IMessageBroker>().Use<RabbitMqBroker>() .Ctor<string>("uri").Is(rabbitMqUri); }); } }
注意:这种方法会提前构建临时服务提供者,仅在必要时使用,优先推荐方法一的构造函数注入,更符合依赖注入的设计原则。
内容的提问来源于stack exchange,提问作者Luka
相关产品推荐
相关产品推荐

