我正在尝试以编程方式和XML方式配置依赖项。我有一个IMyService
类型的服务列表。我已经以编程方式将每个服务注册到容器构建器:
ContainerBuilder builder = new ContainerBuilder();
builder.Register(t => new Logger()).As<ILogger>();
builder.Register(t => new MyService1(t.Resolve<ILogger>()));
builder.Register(t => new MyService2(t.Resolve<ILogger>()));
builder.Register(t => new MyService3(t.Resolve<ILogger>()));
builder.Register(t => new MyService4(t.Resolve<ILogger>()));
builder.Register(t => new MyService5(t.Resolve<ILogger>()));
我现在想做的是通过XML注册这些服务的动态列表,这样我就可以在这些服务中只注入所需的服务(所需的服务可以根据部署环境进行更改)。
我可以这样编程:
builder.Register(t => new List<IMyService> {
t.Resolve<MyService1>(),
t.Resolve<MyService2>(),
t.Resolve<MyService3>() })
.Named<IList<IMyService>>("ListOfMyServices");
但是为了避免代码重新编译以及每次所需服务更改时的部署,我试图通过Autofac XML配置来实现这一点?有没有办法做到这一点?
我的引擎注册表(不需要配置XML)是:
builder.Register(t => new MyEngine(t.ResolveNamed<IList<IMyService>>("ListOfMyServices")));
答案 0 :(得分:0)
Autofac XML配置非常简单, Autofac XML配置不支持此方案。
一种方法是使用命名注册并在AppSettings配置文件中指定所请求服务的列表
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<Logger>().As<ILogger>();
builder.RegisterType<MyService1>().As<IMyService>().Named<IMyService>("Service1");
builder.RegisterType<MyService2>().As<IMyService>().Named<IMyService>("Service2");
builder.RegisterType<MyService3>().As<IMyService>().Named<IMyService>("Service3");
builder.RegisterType<MyService4>().As<IMyService>().Named<IMyService>("Service4");
builder.RegisterType<MyService5>().As<IMyService>().Named<IMyService>("Service5");
然后你可以像这样注册MyEngine
String[] namedServices = ConfigurationManager.AppSettings["MyServices"].Split(',');
builder.Register(c => {
var services = namedServices.Select(s => c.ResolveNamed<IMyService>(s));
return new MyEngine(services.ToList());
})
.As<IMyEngine>();
在您的配置文件中:
<configuration>
<appSettings>
<add key="MyServices" value="Service1,Service2,Service5" />
</appSettings>
</configuration>
答案 1 :(得分:0)
我无法粘贴手机中的代码。 但步骤如下: 1.在XML配置中注册所有服务。但只有您真正打算用于配置的服务。 2.为每个服务分配名称。 3.创建app.config值,您可以在其中存储所有必需的服务。 4.在开始时阅读本节并将其注入服务列表。