微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

依赖注入用于运行时编译的自定义文件提供程序

如何解决依赖注入用于运行时编译的自定义文件提供程序

我正在尝试使用 loading views from a database,并且正如文章中所建议的那样,您可能希望添加一些缓存以防止每次都访问数据库

ConfigureServices

services.AddHttpContextAccessor();
services.AddMemoryCache();

services.AddRazorPages()
    .AddRazorRuntimeCompilation(opt =>
    {
        opt.FileProviders.Add(new DatabaseFileProvider(Configuration["AppSettings:sqlConnectionString"]));
    });

DatabaseFileProvider 构造函数

private string _connection;

public DatabaseFileProvider(string connection)
{
    _connection = connection;
}

如何将 IMemoryCache 的实例依赖注入 DatabaseFileProvider 类?单身人士:

ConfigureServices

services.AddSingleton<AppUtils>();

AppUtils 构造函数

private static IMemoryCache _cache;

public AppUtils(IMemoryCache cache)
{
    _cache = cache;
}

解决方法

使用DI服务直接配置MvcRazorRuntimeCompilationOptions

假设目标提供者像

public class DatabaseFileProvider : IFileProvider {
    private string connection;
    private IMemoryCache cache;

    public DatabaseFileProvider(string connection,IMemoryCache cache) {
        this.connection = connection;
        this.cache = cache;
    }

    //...

}

在 DI 服务的帮助下创建提供程序将允许使用延迟配置委托解析和显式注入任何已注册的依赖项。

参考Use DI services to configure options

services.AddHttpContextAccessor();
services.AddMemoryCache();

services
    .AddOptions<MvcRazorRuntimeCompilationOptions>() 
    .Configure<IServiceProvider>((options,sp) => { //<-- Configuration here
        var cs = Configuration["AppSettings:SQLConnectionString"]);
        var provider = ActivatorUtilities.CreateInstance<DatabaseFileProvider>(sp,cs);
        options.FileProviders.Add(provider);
    });

services.AddRazorPages()
    .AddRazorRuntimeCompilation(); //remove configuration delegate here

Configure 允许使用最多五个服务来配置选项,但如果注入了 IServiceProvider,则可以在需要时使用提供程序解决更多依赖项。

如果该服务定位器方法不是首选,则可以重新安排设置以遵循更纯的 DI 设计。

services.AddHttpContextAccessor();
services.AddMemoryCache();

service.AddTransient<IFileProvider,DatabaseFileProvider>(sp => {
    var cs = Configuration["AppSettings:SQLConnectionString"]);
    var provider = ActivatorUtilities.CreateInstance<DatabaseFileProvider>(sp,cs);
    return provider;
});

//... register other providers if any

services
    .AddOptions<MvcRazorRuntimeCompilationOptions>() 
    .Configure<IEnumerable<IFileProvider>>((options,providers) => {
        //add all registered providers
        foreach(IFileProvider provider in providers) {
            options.FileProviders.Add(provider);
        }
    });

services.AddRazorPages()
    .AddRazorRuntimeCompilation();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。