在 IServiceCollection 扩展方法中读取选项生成器的属性
Read properties of options builder in IServiceCollection extension method
我在 IServiceCollection
上有一个扩展方法,如下所示:
public static IServiceCollection AddMyProjData(this IServiceCollection services, Action<MyProjDataOptionsBuilder> optionsBuilder)
{
services.Configure(optionsBuilder);
services.AddDbContext<MyProjDbContext>(contextOptions => contextOptions
.UseLazyLoadingProxies()
.UseMySql("?????")
);
return services;
}
class MyProjOptionsBuilder
看起来像这样:
public class MyProjDataOptionsBuilder
{
public string ConnectionString { get; set; }
}
如何在我的扩展方法中找到 属性 ConnectionString
?
我想做这样的事情:
var connectionString = optionsBuilder().ConnectionString;
PS.
我知道我可以直接将 string
作为参数而不是 Action
传递给扩展方法 AddMyProjData
。但在我的实际项目中,我需要设置的设置比一个 ConnectionString
.
多得多
我也喜欢使用 Action
配置服务的风格。
您可以在 AddMyProjData
中创建 MyProjDataOptionsBuilder
的实例,将 optionsBuilder
应用于 that 实例,然后使用您需要的属性.
这是一个例子:
public static IServiceCollection AddMyProjData(
this IServiceCollection services,
Action<MyProjDataOptionsBuilder> optionsBuilder)
{
var myProjDataOptionsBuilder = new MyProjDataOptionsBuilder();
optionsBuilder(myProjDataOptionsBuilder);
services.Configure(optionsBuilder);
services.AddDbContext<MyProjDbContext>(contextOptions => contextOptions
.UseLazyLoadingProxies()
.UseMySql(myProjDataOptionsBuilder.ConnectionString)
);
return services;
}
这里发生的事情有一些重复(调用 optionsBuilder
两次),但我不认为这会是一个很大的成本。
另一种方法是将您的配置时间和运行时选项分开 - 我怀疑您是否会在扩展方法内部以外的任何地方需要连接字符串本身,但我只是在这里猜测。
根据您在 OP 中显示的内容,我不相信 MyProjDataOptionsBuilder
是一个好名字(我可能会选择 MyProjDataOptions
),但这主要是放在一边这里。
我在 IServiceCollection
上有一个扩展方法,如下所示:
public static IServiceCollection AddMyProjData(this IServiceCollection services, Action<MyProjDataOptionsBuilder> optionsBuilder)
{
services.Configure(optionsBuilder);
services.AddDbContext<MyProjDbContext>(contextOptions => contextOptions
.UseLazyLoadingProxies()
.UseMySql("?????")
);
return services;
}
class MyProjOptionsBuilder
看起来像这样:
public class MyProjDataOptionsBuilder
{
public string ConnectionString { get; set; }
}
如何在我的扩展方法中找到 属性 ConnectionString
?
我想做这样的事情:
var connectionString = optionsBuilder().ConnectionString;
PS.
我知道我可以直接将 string
作为参数而不是 Action
传递给扩展方法 AddMyProjData
。但在我的实际项目中,我需要设置的设置比一个 ConnectionString
.
我也喜欢使用 Action
配置服务的风格。
您可以在 AddMyProjData
中创建 MyProjDataOptionsBuilder
的实例,将 optionsBuilder
应用于 that 实例,然后使用您需要的属性.
这是一个例子:
public static IServiceCollection AddMyProjData(
this IServiceCollection services,
Action<MyProjDataOptionsBuilder> optionsBuilder)
{
var myProjDataOptionsBuilder = new MyProjDataOptionsBuilder();
optionsBuilder(myProjDataOptionsBuilder);
services.Configure(optionsBuilder);
services.AddDbContext<MyProjDbContext>(contextOptions => contextOptions
.UseLazyLoadingProxies()
.UseMySql(myProjDataOptionsBuilder.ConnectionString)
);
return services;
}
这里发生的事情有一些重复(调用 optionsBuilder
两次),但我不认为这会是一个很大的成本。
另一种方法是将您的配置时间和运行时选项分开 - 我怀疑您是否会在扩展方法内部以外的任何地方需要连接字符串本身,但我只是在这里猜测。
根据您在 OP 中显示的内容,我不相信 MyProjDataOptionsBuilder
是一个好名字(我可能会选择 MyProjDataOptions
),但这主要是放在一边这里。