gpt4 book ai didi

c# - 使用 AutoFac 根据构造函数参数名传递不同的实例

转载 作者:行者123 更新时间:2023-12-04 00:32:32 25 4
gpt4 key购买 nike

我有一个这样的类(WebApi 2 Controller ):

class DatabaseAnalysisController (IDatabase databaseOne, 
IDatabase databaseTwo) : ApiController

还有一个像这样的类:

class Database : IDatabase

现在我有两个实例:

Database databaseOne = new Database("one");
Database databaseTwo = new Database("two");

我不希望 DatabaseAnalysis 对 Autofac 有任何依赖。但我想使用 Autofac 根据构造函数的参数名称进行注入(inject)。

我正在使用 Autofac.WebApi 注册我的 Controller 。

builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

但是之后这将不起作用,因为 databaseOnedatabaseTwo 都是 IDatabase

builder.RegisterInstance(new Database("one")).As<IDatabase>();

Autofac 是否可以将 databaseOne 注入(inject)到 DatabaseAnalysis 构造函数的 databaseOne 中(以及 databaseTwo)进入databaseTwo)?

如果是这样,怎么办? :P

最佳答案

由于您有多个具有相同接口(interface)和类型的实例 - 您需要使用名称注册它们:

builder.RegisterInstance(new Database("one")).Named<IDatabase>("databaseOne");
builder.RegisterInstance(new Database("two")).Named<IDatabase>("databaseTwo");

然后您可以像这样注册您的DatabaseAnalysisController:

builder.RegisterType<DatabaseAnalysis>().WithParameter(
(pi, ctx) => pi.ParameterType == typeof(IDatabase),
(pi, ctx) => ctx.ResolveNamed<IDatabase>(pi.Name));

您可以创建一个扩展方法来执行此类注册,如下所示:

public static class AutofacExtensions {
public static IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> WithNamedParameter<TLimit, TReflectionActivatorData, TStyle>(this IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> registration, Type targetType)
where TReflectionActivatorData : ReflectionActivatorData {
return registration.WithParameter(
(pi, ctx) => pi.ParameterType == targetType,
(pi, ctx) => ctx.ResolveNamed(pi.Name, targetType));
}
}

要对所有 Controller 执行此操作,请执行以下操作:

builder.RegisterApiControllers().WithNamedParameter(typeof(IDatabase));

关于c# - 使用 AutoFac 根据构造函数参数名传递不同的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46971039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com