autofac container.ResolveNamed 传参数
时间: 2023-08-21 11:08:00 浏览: 121
当你使用 Autofac 中的 `ResolveNamed` 方法解析指定命名的组件时,你可以通过 `NamedParameter` 类型的对象来传递参数。下面是一个例子:
假设我们有一个 `SomeService` 类型的组件,它有一个名为 `param` 的构造函数参数。我们想要解析这个组件的一个名为 `foo` 的实例,并为构造函数参数传递一个值为 `42` 的整数。
首先,我们需要在注册服务时为它们指定名称和参数。我们可以像这样注册:
``` csharp
var builder = new ContainerBuilder();
builder.RegisterType<SomeService>().Named<ISomeService>("foo")
.WithParameter("param", 42);
```
注意,我们在注册服务时使用 `WithParameter` 方法来传递构造函数参数。
然后,我们可以使用 `NamedParameter` 类型和 `ResolveNamed` 方法来解析指定名称的服务实现,并传递构造函数参数。例如,我们可以像这样解析名为 `foo` 的服务,并传递 `param` 参数:
``` csharp
var container = builder.Build();
var service = container.ResolveNamed<ISomeService>("foo", new NamedParameter("param", 42));
```
这将返回一个名为 `foo` 的 `SomeService` 实例,并且该实例的 `param` 参数将设置为 `42`。
需要注意的是,如果组件中有多个构造函数或多个同名的构造函数参数,则需要使用 `ResolvedParameter` 类型的对象来指定要使用的构造函数或构造函数参数。例如,如果 `SomeService` 类型有两个构造函数,其中一个接受一个整数类型的参数,那么我们需要使用 `ResolvedParameter` 类型的对象来指定要使用的构造函数。例如:
``` csharp
var container = builder.Build();
var service = container.ResolveNamed<ISomeService>("foo", new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(int),
(pi, ctx) => 42));
```
这将返回一个名为 `foo` 的 `SomeService` 实例,并且该实例的构造函数参数将设置为 `42`。
阅读全文