如何解析 Autofac 中的依赖项列表?
How to resolve list of dependencies in Autofac?
我想要注册类型,而不是解析类型,然后使用解析值注册实例。像这样:
//Register type:
builder.RegisterType<ValidateImportMandatoryColumns>().Named<IValidateImport>("MandatoryColumn").As<IValidateImport>();
builder.RegisterType<ValidateImportNonMandatoryColumns>().Named<IValidateImport>("NonMandatoryColumns").As<IValidateImport>();
//Resolve
var t1 = Container.ResolveNamed<IValidateImport>("MandatoryColumn");
var t2 = Container.ResolveNamed<IValidateImport>("NonMandatoryColumns");
//Create list with resolved values:
List<IValidateImport> allValidators = new List<IValidateImport>(){t1,t2};
//Register Instance:
builder.RegisterInstance(allValidators).As<List<IValidateImport>>();
这是行不通的。我无法解决,只能重新注册。你知道如何用 Autofac 做到这一点吗?也许方法不对,所以如果您有更好的主意,请告诉我。 目标是注入使用相同接口的不同类型的验证器列表。
Autofac 内置了对集合的支持。如果要解析全部IValidateImport
,可以解析IEnumerable<IValidateImport>
var allValidators = container.Resolve<IEnumerable<IValidateImport>>();
查看Implicit Relationship Types了解更多信息。
顺便说一句,如果你想更新一个容器,这里不需要,你可以使用下面的一段代码。
var builder = new ContainerBuilder();
// do some registration
var container = builder.Build();
var updater = new ContainerBuilder();
// do other registraitons
// update the container
updater.Update(container);
我想要注册类型,而不是解析类型,然后使用解析值注册实例。像这样:
//Register type:
builder.RegisterType<ValidateImportMandatoryColumns>().Named<IValidateImport>("MandatoryColumn").As<IValidateImport>();
builder.RegisterType<ValidateImportNonMandatoryColumns>().Named<IValidateImport>("NonMandatoryColumns").As<IValidateImport>();
//Resolve
var t1 = Container.ResolveNamed<IValidateImport>("MandatoryColumn");
var t2 = Container.ResolveNamed<IValidateImport>("NonMandatoryColumns");
//Create list with resolved values:
List<IValidateImport> allValidators = new List<IValidateImport>(){t1,t2};
//Register Instance:
builder.RegisterInstance(allValidators).As<List<IValidateImport>>();
这是行不通的。我无法解决,只能重新注册。你知道如何用 Autofac 做到这一点吗?也许方法不对,所以如果您有更好的主意,请告诉我。 目标是注入使用相同接口的不同类型的验证器列表。
Autofac 内置了对集合的支持。如果要解析全部IValidateImport
,可以解析IEnumerable<IValidateImport>
var allValidators = container.Resolve<IEnumerable<IValidateImport>>();
查看Implicit Relationship Types了解更多信息。
顺便说一句,如果你想更新一个容器,这里不需要,你可以使用下面的一段代码。
var builder = new ContainerBuilder();
// do some registration
var container = builder.Build();
var updater = new ContainerBuilder();
// do other registraitons
// update the container
updater.Update(container);