在循环中动态地将单例添加到IServiceCollection

时间:2017-09-14 21:53:02

标签: c# .net dependency-injection asp.net-core .net-core

您好我有一个由多个类实现的接口。

public interface IHuman
{
    void Talk();
}

public class AdultHuman
{
    public void Talk()
    {
          Console.Writeline("Hi");
    }
}

public class BabyHuman
{
     public void Talk()
    {
          Console.Writeline("Babble");
    }
}


public enum HumanEnums
{
    Adult,
    Baby
}

目前在我的创业公司添加我有

services.AddSingleton<AdultHuman>();
services.AddSingleton<BabyHuman>();

我们不断添加IHumans的不同实现,所以我希望我的启动添加为动态添加单圈,循环通过HumanEnums的值,所以它看起来像这样

var enumTypes = Enum.GetValues(typeof(ActionTypes));
foreach(var enum in enumTypes)
{
     var type = typeof(IHuman);

     // namespace + name of class i.e MyProgram.Humans.BabyHuman
     var typeName = $"{type.Namespace}.{action}Human";
     var t = Type.GetType(typeName, true);
     services.AddSingleton< --something here-- >();
}

我将如何实现这一目标?

P.S。另外,如果不是循环遍历枚举,我可以找到IHuman的所有实现并循环遍历它。

1 个答案:

答案 0 :(得分:1)

谢谢你们,我能帮你解决它!我没有意识到你可以添加单一类型而不是类。所以我用了AddSingleton(typeof(Adult));而不是AddSingleton();

var humanTypes = typeof(IHuman).
            GetTypeInfo().Assembly.DefinedTypes
            .Where(t => typeof(IHuman).GetTypeInfo().IsAssignableFrom(t.AsType()) && t.IsClass)
            .Select(p => p.AsType());


foreach(var humanType in humanTypes )
{
    services.AddSingleton(humanType);
}