gpt4 book ai didi

c# - 解析同一接口(interface)的两个实例

转载 作者:行者123 更新时间:2023-12-01 16:27:14 25 4
gpt4 key购买 nike

如果我有两个具有相同接口(interface)的类,以及一个采用两个不同版本的构造函数 - 如何使用 Unity 容器来解决依赖关系?

这是一个简单的测试:

class Dependant
{
public Dependant(ILog dbLog, ILog fsLog)
{
foreach (var i in Enumerable.Range(1, 15))
{
if (i%3 == 0)
dbLog.Log(string.Format("{0} - going to DB", i));
else
fsLog.Log(string.Format("{0} - going to FS", i));
}
}
}

现在,我想使用容器来解决依赖关系。我试过这个:

static void Main(string[] args)
{
var container = new UnityContainer();

container.RegisterType<ILog, DatabaseLogger>();
container.RegisterType<ILog, FileLogger>();

var dependant = container.Resolve<Dependant>();
}

但是当使用 FileLogger 的两个实例解析 Dependent 时。我尝试为注册提供名称,以匹配构造函数使用的名称,但这不起作用。

最佳答案

您可以使用命名组件注册/解析同一接口(interface)的两个实现。对于您的示例,它看起来类似于以下内容

var container = new UnityContainer();

container.RegisterType<ILog, DatabaseLogger>("databaseLogger");
container.RegisterType<ILog, FileLogger>("fileLogger");

container.RegisterType<Dependant>(new InjectionConstructor(
new ResolvedParameter<ILog>("databaseLogger"),
new ResolvedParameter<ILog>("fileLogger")));

var dependant = container.Resolve<Dependant>();

如果您省略命名,您还可以将数据库记录器注册为默认记录器,例如

container.RegisterType<ILog, DatabaseLogger>();
container.RegisterType<ILog, FileLogger>("fileLogger");

在这种情况下,解析ILog将使用您的DatabaseLogger。因此无需根据需要定义更多接口(interface)。

编辑

我修改了上面的代码片段,因为我认为它更适合您的需求。

关于c# - 解析同一接口(interface)的两个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983231/

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