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;}
注入效果很好,但我遇到的问题是,当我开始在我的代码中使用该服务时,我必须手动注入 BaseUriAddress
和 EndpointAddress
。这有点烦人,因为这意味着我必须设置一些构造函数和手动 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 中)确实适用。
我有一个 Ninject 模块,基本上是这样的:
public class ExternalApiService {
public string BaseUriAddress {get; set;}
public string EndpointAddress {get; set;}
}
然后在我的各种 类 中执行以下操作:
[Inject]
public IExternalApiService ExternalApiService {get; set;}
注入效果很好,但我遇到的问题是,当我开始在我的代码中使用该服务时,我必须手动注入 BaseUriAddress
和 EndpointAddress
。这有点烦人,因为这意味着我必须设置一些构造函数和手动 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 中)确实适用。