gpt4 book ai didi

inversion-of-control - NInject "mis"- 在多个映射中解析 "default"实例

转载 作者:行者123 更新时间:2023-12-05 01:15:07 32 4
gpt4 key购买 nike

我正在研究 IoC 容器,在使用 NInject 时遇到了一个问题。

当我有一个接口(interface)时,我定义了该接口(interface)的多个映射 - 一个未命名,我的默认映射,以及另外两个命名实例 - 使用 Microsoft Unity,当要求 Unity 解析接口(interface)时,我很好地获得了注册的默认类型无需指定名称。

统一:

myContainer.RegisterType<ILogger, DefaultLogger>();
myContainer.RegisterType<ILogger, FastLogger>("fast");
myContainer.RegisterType<ILogger, DatabaseLogger>("dblogger");

var result = myContainer.Resolve<ILogger>();

在这里,result 将是 DefaultLogger 类型 - 正如我所期望的(Autofac 也以这种方式工作)。

其他容器的行为不同——有些以非常奇怪的方式。而 NInject 只会导致异常:

k.Bind<ILogger>().To<DefaultLogger>();
k.Bind<ILogger>().To<FastLogger>().Named("fast");
k.Bind<ILogger>().To<DatabaseLogger>().Named("dblogger");

var result = k.Get<ILogger>();

我没有像预期的那样得到 DefaultLogger 的实例,而是得到了一个异常:

Ninject.ActivationException was unhandled
Message=Error activating ILogger
More than one matching bindings are available.

是的——我知道我有多个映射——但我希望在明确不要求命名映射时我会得到非命名映射......

我可以让它在 NInject 中工作吗?还是我只需要命名所有映射并要求命名映射,即使对于默认情况也是如此?

最佳答案

这行得通

class Program
{
static void Main(string[] args)
{
var kernel = new StandardKernel();

kernel.Bind<IOperation>().To<DefaultOperation>()
.When(c => !c.Parameters.Any());

kernel.Bind<IOperation>().To<SuccessOperation>()
.Named("Success");

kernel.Bind<IOperation>().To<FailureOperation>()
.Named("Failure");

var operation = kernel.Get<IOperation>();
operation.ShowMessage();
Console.ReadLine();
}
}

关于inversion-of-control - NInject "mis"- 在多个映射中解析 "default"实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18281766/

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