C# 中的 Autofac 自定义配置

Autofac custom configuration in C#

我有 3 个 classes Class1、2 和 3 和一个 class Manage

public class Class1
{
  public void PrintMessageForClass1()
  {
     Console.WriteLine("This is class1");
  }
}


public class Class2
{
  public void PrintMessageForClass2()
  {
     Console.WriteLine("This is class2");
  }
}

public class Class3
{
  public void PrintMessageForClass3()
  {
     Console.WriteLine("This is class3");
  }
}


public class Manage
{
  Class1 c1;
  Class2 c2;
  Class3 c3;

  public Manage (Class1 c1, Class2 c2 ,Class3 c3)
  {
     this.c1 = c1;
     this.c2 = c2;
     this.c3 = c3;
  }

  public void Print()
  {
      c1.PrintMessageForClass1();
      c2.PrintMessageForClass2();
      c3.PrintMessageForClass3();
   }    
}

然后我使用 autofac 作为 follows

class ContainerConfig
{
   public static IContainer Configure()
   {
       var builder = new ContainerBuilder();

       builder.RegisterType<Manage>().AsSelf();

       builder.RegisterType<Class1>().AsSelf();
       builder.RegisterType<Class2>().AsSelf();
       builder.RegisterType<Class3>().AsSelf();

      return builder.Build();
   }
}

在class程序中:

 class Program
 {
     static void Main(string[] args)
     {
        var container = ContainerConfigcs.Configure();

        using (var scope = container.BeginLifetimeScope())
         {
              var c = container.Resolve<Manage>();
              c.Print();
         }
     }
 }

现在,输出是:

This is class1
This is class2
This is class3

但我想使用 App.config,在应用程序设置中我可以使用 1,2 或 3 之类的值。对于此示例,我将值设置为 1

 <appSettings>
    <add key="classType" value="1" />
  </appSettings>

我想使用 App.config 中的这个值来使 autofac 仅使用三个 class 中的一个。例如,如果值为1,我想使用Class1,那么在控制台上只会打印 这是class1。 如果我将值更改为 2,我希望 autofac 使用 Class2,依此类推。

如何设置 autofac 以接收 AppConfig 中的值?

您应该可以使用 System.Configuration 中的 ConfigurationManager.AppSettings,这样您就可以提取 appConfig。 https://docs.microsoft.com/en-us/dotnet/api/system.configuration.configurationmanager.appsettings?view=dotnet-plat-ext-3.1

您可以通过 classType 键访问 appSettings,然后根据它进行切换。现在我们有了 classType 值,我们可以准确地决定要在哪里使用它。我提出两个方案,按推荐顺序排列。

Autofac 并不完全适用于您的问题。如果您希望 Autofac 发生切换,Class1Class2Class3 必须 实施相同的界面.. 说 IPrintStuff。然后在你的容器配置中,注册 one 实现 IPrintStuff.

public static IContainer Configure()
{
   var builder = new ContainerBuilder();
   var classType = System.Configuration.ConfigurationManager.AppSettings["classType"].ToString();

   builder.RegisterType<Manage>().AsSelf();

    switch(classType)
    {
      case "1":
          builder.RegisterType<Class1>().As<IPrintStuff>();
      break;
      case "2":
          builder.RegisterType<Class2>().As<IPrintStuff>();
      break;
      case "3":
          builder.RegisterType<Class3>().As<IPrintStuff>();
      break;
    }

  return builder.Build();
}

(然后Manage不再接受3个类,它接受1个IPrintStuff类型的参数)

另一种方法是在 Manage.cs 更高一点的地方进行。它仍然是不利的,因为你仍然需要 new up 3 个对象,但只调用一个。

Manage.cs

public void Print()
{ 
    var classType = System.Configuration.ConfigurationManager.AppSettings["classType"];
    switch(classType)
    {
      case "1":
          c1.PrintMessageForClass1();
      break;
      case "2":
          c2.PrintMessageForClass2();
      break;
      case "3":
          c3.PrintMessageForClass3();
      break;
    }
}