[英]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 Class2
和Class3
必須實現相同的接口..說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.