C#中的Autofac自定义配置

问题描述 投票:0回答:1

我有3个班级Class1、2和3,还有一个班级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用作关注对象

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 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,其中在appsettings中,我可以将值设为1,2或3。在本示例中,我将该值设置为1

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

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

如何设置自动接收在AppConfig中的值?

c# autofac
1个回答
2
投票

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

您可以通过classType键访问appSettings,然后根据其进行切换。现在我们有了classType值,我们可以精确地决定要在哪里使用它。我按照建议的顺序提出了两种选择。

Autofac并不完全适用于您的问题。如果要通过Autofac only进行切换,则Class1Class2Class3 必须实施相同的接口。例如说IPrintStuff。然后,在您的容器配置中,注册实现的oneIPrintStuff

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中将其做得更高。这仍然是不利的,因为您仍然必须更新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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.