Ninject 是否支持运行时注入?

Does Ninject support runtime injection?

我有一个 Ninject 模块,基本上是这样的:

public class ExternalApiService {
    public string BaseUriAddress {get; set;}
    public string EndpointAddress {get; set;}
}

然后在我的各种 类 中执行以下操作:

[Inject]
public IExternalApiService ExternalApiService {get; set;}

注入效果很好,但我遇到的问题是,当我开始在我的代码中使用该服务时,我必须手动注入 BaseUriAddressEndpointAddress。这有点烦人,因为这意味着我必须设置一些构造函数和手动 IOC,这在某种程度上抵消了 IOC 框架的意义。

我看到我可以进行构造函数和字段注入,但是,似乎所有这些都是在编译时确定的。这不太正确,因为无论何时我使用 ExternalApiService,我都不能保证相同的基地址和端点地址。

理想情况下,我正在寻找某种方法来在 运行 时间指定这些参数,使用 Ninject,但很难找到如何/如果可能的话。理想情况下是这样的:

[Inject(BaseUriAddress = "", EndpointAddress = "")]
public IExternalApiService ExternalApiService {get; set;}

显然不完全是那样,但这本质上是我试图实现的那种功能。这可能吗?

如果它是瞬态的并且需要 "dynamic" 参数,那么您需要使用工厂。 你可以选择 Abstract Factory as Mark Seemann describes it.

或者,您可以使用 Func<TParam1,TParam2,..,TToBeCreated> 或具有动态生成实现的基于接口的工厂(基于动态代理的方法)——两者均由 Ninject.Extensions.Factory 提供。

我个人更喜欢基于接口的工厂,因为它非常适合阅读和单元测试,但要注意,Mark Seemann 概述的缺点(也在上面的 link 中)确实适用。