Ninject是否支持运行时注入?

时间:2015-04-10 15:45:40

标签: c# ninject inversion-of-control

我有一个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;}

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

1 个答案:

答案 0 :(得分:1)

如果它是瞬态的并且需要“动态”参数,那么您需要使用工厂。 您可以使用Abstract Factory as Mark Seemann describes it

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

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