使用反射通过循环将多个服务添加到IServiceCollection

奥拉夫·斯文森(Olaf Svenson)

在DI容器设置过程中,我有多个服务依赖于手动设置。例如,其中一些需要数据库连接字符串。所以不要写

services.AddTransient(typeof(TheInterface), typeof(TheImplementation));

我要做

services.AddTransient<TheInterface>(serviceProvider => 
{
    // gather all the constructor parameters here
    return new TheImplementation(/* pass in the constructor parameters */);
});

构造函数参数始终相同。我没有写这多次,而是考虑创建这些服务的集合并遍历该集合。我知道我可以使用Activator从类型创建新实例,但是我正在努力从类型到泛型的转换。以下代码是用于演示目的的示例代码

    public void SetupServices(IServiceCollection services, string databaseConnectionString)
    {
        IDictionary<Type, Type> servicesTypes = new Dictionary<Type, Type>()
        {
            { typeof(MyInterface), typeof(MyImplementation) }
            // ... more services here
        };

        foreach (KeyValuePair<Type, Type> servicesType in servicesTypes)
        {
            services.AddTransient <??? /* servicesType.Key does not work here */> (serviceProvider =>
            {
                return Activator.CreateInstance(servicesType.Value, databaseConnectionString /*, other params */);
            });
        }
    }

我正在努力的位置是这条线

services.AddTransient <??? /* servicesType.Key does not work here */>

我如何将服务接口类型转换为通用类型?我什至不确定这个循环是否值得努力...但是目前我有5个服务可以使用它。

乔纳斯·MH

我不确定执行通用版本是否正确。可以使用选项模式来固定服务的“手动设置”吗?看起来您正在尝试传递数据库连接字符串。

它可能看起来像

// Options object
public class DatabaseOptions {
   public string ConnectionString {get;set;}
}

// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    [...]
    // From configuration (appsettings.json)
    services.Configure<DatabaseOptions>(Configuration.GetSection("Database"));
    // OR directly
    services.Configure<DatabaseOptions>(x => x.ConnectionString = "SomeString");

}

// The service
public class SomeService {
    public SomeService(IOptions<DatabaseOptions> dbOptions) {
        var connectionString = dbOptions.Value.ConnectionString;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过循环将类添加到多个HTML元素

来自分类Dev

通过sql循环动态将多个TextView添加到TableRow

来自分类Dev

通过for循环将子列表添加到arraylist

来自分类Dev

如何通过循环将变量添加到字典中?

来自分类Dev

通过循环将键添加到对象会出错

来自分类Dev

通过Java API将记录循环添加到OrientDB

来自分类Dev

通过循环将数据添加到HashMap中

来自分类Dev

R:通过循环将值添加到向量

来自分类Dev

循环后解析将多个图像添加到数组

来自分类Dev

如何使用for循环将列标题列表添加到多个文件

来自分类Dev

如何使用Terraform将多个服务器添加到Hetzner Cloud中的LoadBalancer?

来自分类Dev

使用systemd-networkd将多个静态IP地址添加到服务器

来自分类Dev

通过Servlet使用会话将多个商品添加到购物车

来自分类Dev

如何使用javascript通过名称将年份添加到多个下拉列表中?

来自分类Dev

通过反射实例化时,将类型的实例添加到该类型的列表中

来自分类Dev

使用Iterator循环时将项目添加到HashMap

来自分类Dev

将矩阵添加到结构列而不使用for循环?

来自分类Dev

使用循环将地图元素添加到列表

来自分类Dev

使用for循环将JPanels添加到JFrame

来自分类Dev

使用for循环将EditText添加到android中的布局

来自分类Dev

使用For循环混淆将表单添加到字典中

来自分类Dev

使用for循环将CCNode添加到父CCNode

来自分类Dev

使用游标循环将JS对象添加到数组

来自分类Dev

在C中使用for循环将数字添加到数组

来自分类Dev

在R中使用For循环将元素添加到列表

来自分类Dev

使用for循环将EditText添加到android中的布局

来自分类Dev

使用循环将arrayList添加到arraylist

来自分类Dev

使用for循环将值添加到MySQL插入查询

来自分类Dev

使用循环将行添加到表

Related 相关文章

  1. 1

    通过循环将类添加到多个HTML元素

  2. 2

    通过sql循环动态将多个TextView添加到TableRow

  3. 3

    通过for循环将子列表添加到arraylist

  4. 4

    如何通过循环将变量添加到字典中?

  5. 5

    通过循环将键添加到对象会出错

  6. 6

    通过Java API将记录循环添加到OrientDB

  7. 7

    通过循环将数据添加到HashMap中

  8. 8

    R:通过循环将值添加到向量

  9. 9

    循环后解析将多个图像添加到数组

  10. 10

    如何使用for循环将列标题列表添加到多个文件

  11. 11

    如何使用Terraform将多个服务器添加到Hetzner Cloud中的LoadBalancer?

  12. 12

    使用systemd-networkd将多个静态IP地址添加到服务器

  13. 13

    通过Servlet使用会话将多个商品添加到购物车

  14. 14

    如何使用javascript通过名称将年份添加到多个下拉列表中?

  15. 15

    通过反射实例化时,将类型的实例添加到该类型的列表中

  16. 16

    使用Iterator循环时将项目添加到HashMap

  17. 17

    将矩阵添加到结构列而不使用for循环?

  18. 18

    使用循环将地图元素添加到列表

  19. 19

    使用for循环将JPanels添加到JFrame

  20. 20

    使用for循环将EditText添加到android中的布局

  21. 21

    使用For循环混淆将表单添加到字典中

  22. 22

    使用for循环将CCNode添加到父CCNode

  23. 23

    使用游标循环将JS对象添加到数组

  24. 24

    在C中使用for循环将数字添加到数组

  25. 25

    在R中使用For循环将元素添加到列表

  26. 26

    使用for循环将EditText添加到android中的布局

  27. 27

    使用循环将arrayList添加到arraylist

  28. 28

    使用for循环将值添加到MySQL插入查询

  29. 29

    使用循环将行添加到表

热门标签

归档