我有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
中的值?
您应该能够使用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进行切换,则Class1
,Class2
和Class3
必须实施相同的接口。例如说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.cs中将其做得更高。这仍然是不利的,因为您仍然必须更新3个对象,但只能调用一个。Manage
不再接受3个类,它接受1个类型为IPrintStuff的参数)]] >>
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;
}
}