【发布时间】:2016-02-17 11:35:50
【问题描述】:
我有一个抽象工厂,它创建一些由IService 接口表示的服务。在工厂中,我有两个 Create 方法,因为在其中一个方法中,我允许消费者传递现有的 IServiceLogger 实例以供构建的服务树使用。
public interface IMyServiceFactory {
IMyService Create(IServiceLogger loggerInstance);
IMyService Create();
}
因为IServiceLogger 应该在服务树之间共享,所以我在将其绑定到具体实现时使用InCallScope。
如何使用 Ninject 实现这个场景?我尝试了以下方法。
1.手动创建工厂实现
internal class MyServiceFactory : IMyServiceFactory {
private IResolutionRoot _kernel;
public MyServiceFactory
public IMyService Create(IServiceLogger loggerInstance) {
// what should go here? how can I pass the existing instance to Ninject Get method and make Ninject to use it for the whole resolution tree, just as it were created by Ninject and used as InCallScope?
}
// this one is trivial...
pulbic IMyService Create() {
return _kernel.Get<IMyService>();
}
}
更新
实际上,我为此找到了一种混乱且不太安全的方法。我可以通过GetBindings获取当前绑定,然后RebindIServiceLoggerToConstant,然后GetIMyService实例,最后用AddBinding恢复原始绑定。我不喜欢它,感觉很臭,更糟糕的是,它不是线程安全的,因为另一个线程可以在这段代码中间请求IMyService,因此使用本地临时绑定。
2。使用 Ninject.Extensions.Factory
只需使用ToFactory 绑定,但这不起作用,因为它只是尝试将参数用作简单的构造函数参数(如果适用),而不是作为整个解析树的对象。
【问题讨论】:
标签: c# ninject ninject-extensions