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 仅 发生切换,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
不再接受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;
}
}
我有 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 仅 发生切换,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
不再接受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;
}
}