我有一个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;}
显然不完全是这样,但这实际上是我试图实现的那种功能。这可能吗?
答案 0 :(得分:1)
如果它是瞬态的并且需要“动态”参数,那么您需要使用工厂。 您可以使用Abstract Factory as Mark Seemann describes it。
或者,您可以使用Func<TParam1,TParam2,..,TToBeCreated>
或基于接口的工厂和动态生成的实现(基于动态代理的方法) - 这两者都由Ninject.Extensions.Factory提供。
我个人更喜欢基于接口的工厂,因为它非常适合阅读和单元测试,但要注意,Mark Seemann概述的缺点(也在上面的链接中)确实适用。