簡體   English   中英

C#中的Autofac自定義配置

[英]Autofac custom configuration in C#

我有 3 個班級 Class1、2 和 3 以及一個 class

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 程序中:

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

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

目前,output 是:

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 ,所以在控制台上只會打印 This is 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 進行切換, Class1 , Cl Class2Class3必須實現相同的接口..說IPrintStuff 然后在您的容器配置中,注冊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 中將其做得更高一點。 這仍然是不利的,因為您仍然必須更新 3 個對象,但只調用一個。

管理.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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM