是否可以在configure服务中调用services.buildserviceprovider方法,以便能够在configure services方法本身中使用服务实例。
用例是我有一个加密服务,可以进行自定义加密/解密。我在appsettings.json文件中加密了连接字符串,需要将未加密的字符串传递给ef设置以创建SQL数据库上下文。因此,我需要在此配置服务方法中使用加密服务。它可以是单例或瞬态无关紧要。这种方法有替代方案吗?
发布于 2019-05-29 10:16:28
可以
services.BuildServiceProvider
在ConfigureServices
[...]中调用方法吗?
一般来说?否。创建其他服务提供商只会让您在不应该有单独生命周期的情况下处理多个不同的生命周期。虽然在简单的配置案例中它可能是可管理的,但你应该避免这种做法。
我有[要求]在此
ConfigureServices
方法中使用加密服务。
这实际上是一个非常常见的用例,使用其他依赖项在ASP.NET Core中配置内容。这个东西可以是几乎任何东西,包括EF Core连接字符串。你可以使用任何类型的依赖。最常见的用例是根据其他配置值配置某些内容。
通常,如果要配置对服务具有依赖性的内容,可以使用该AddOptions<T>
方法和a OptionsBuilder<T>
配置相关配置操作。
对于核心的EntityFramework,工作的事情有点不同,但默认AddDbContext<T>
,这是用来注册和配置数据库的情况下,实际上有一个有用的过载,其中optionsAction
是类型的Func<IServiceProvider, DbContextOptionsBuilder>
。您可以使用它来注册配置操作,然后从服务提供程序解析您的服务以配置数据库上下文:
services.AddSingleton<ConnectionStringEncryptionService>();
services.AddDbContext<MyContext>((sp, options) =>
{
var encryptionService = sp.GetService<ConnectionStringEncryptionService>();
var connectionString = encryptionService.GetConnectionString();
options.UseSqlServer(connectionString);
});
现在,当MyContext
实例化并解析时DbContextOptions<MyContext>
,将运行该操作,该操作将从服务提供者解析服务以首先解密连接字符串。
关于此的一个重要注意事项是,默认情况下,数据库上下文和上下文选项都被注册为作用域依赖项。这意味着每次请求都会创建一次。这也意味着上面的回调将每个请求运行一次,导致解密过程每个请求运行一次(除非服务进行缓存)。
您应该考虑更改数据库上下文选项的生命周期(尽管不是数据库上下文本身!),使其成为单例,以便它只运行一次:
services.AddDbContext<MyContext>((sp, options) =>
{
// …
}, optionsLifetime: ServiceLifetime.Singleton);
https://stackoverflow.com/questions/-100006840
复制相似问题