gpt4 book ai didi

c# - Ninject 工厂基于枚举创建 T

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:12 25 4
gpt4 key购买 nike

我想让 Ninject 根据特定的枚举输入值解析 T 的实例。

我读过 Ninject 的工厂扩展,但我找不到任何让工厂根据枚举解析特定类的示例。

每个类都派生自一个基类,派生类有几个不同的接口(interface),Ninject 也必须解析这些接口(interface)。

例如,界面应该是这样的:

public interface IProcessFactory
{
T Create<T>(ProcessIndex processIndex) where T : BaseProcess;
}

如何实现?

最佳答案

开箱即用不支持。您可以通过编写自己的 IInstanceProvider 实现来自定义它(另见 ninject Wiki entry 。然后为您的特定工厂配置它:

kernel.Bind<IFooFactory>()
.ToFactory(() => new MyCustomInstanceProvider());

或者,如果您想更改所有 .ToFactory() 绑定(bind)的行为:加载 Ninject.Extensions.Factory 后重新绑定(bind) IInstanceProvider >:

kernel.Rebind<IInstanceProvider>().To<MyCustomInstanceProvider>();

但是,如果它不是您经常需要的东西,我会考虑手动编写工厂实现 @composition root。

无论如何,在这两种情况下,您都需要知道如何创建条件绑定(bind)。 Ninject 称之为 Contextual Binding .一种方法是使用绑定(bind)元数据:

const string EnumKey = "EnumKey";

Bind<IFoo>().To<AFoo>()
.WithMetadata(EnumKey, MyEnum.A);

IResolutionRoot.Get<IFoo>(x => x.Get<MyEnum>(EnumKey) == MyEnum.A);

另一种方法是创建自定义 IParameter并在条件绑定(bind)中使用:

Bind<IFoo>().To<AFoo>()
.When(x => x.Parameters.OfType<MyParameter>().Single().Value == A);

关于c# - Ninject 工厂基于枚举创建 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29941052/

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