如何解决 Ninject.OnActivation 中的其他依赖项?
How Can I Resolve Other Dependencies within Ninject .OnActivation?
我正在使用 Ninject 为 class 设置绑定,它是 IObservable
。
我已经设置了一个重新绑定以确保 IObservable
有它的 IObserver
订阅如下...
kernel.Rebind<IAddressRepository>().To<AddressRepository>().InRequestScope()
.OnActivation(repo => repo
.Subscribe(new SyncTrackerDataEventObserver<Address, AddressRepository>()));
这似乎工作正常,但实际上并不理想。 SyncTrackerDataEventObserver
会,当它不仅仅是一个存根时,它会拥有自己的依赖项。然后我们得到这个...
kernel.Rebind<IAddressRepository>().To<AddressRepository>().InRequestScope()
.OnActivation(repo => repo
.Subscribe(new SyncTrackerDataEventObserver<Address, AddressRepository>(new SyncTrackerRepository(new SyncDataSource))));
哎哟!!
此时我想做的是利用现有的绑定。我希望能够写出这样的东西(但这只是编造的..)
kernel.Rebind<IAddressRepository>().To<AddressRepository>().InRequestScope()
.OnActivation(repo => repo
.Subscribe(kernel.Resolve<ISyncTrackerDataEventObserver>()));
在不创建大量硬编码依赖项和破坏 IoC 范例的情况下实现此目标的正确方法是什么?
当我想出要看的地方时,这非常简单。 kernel.TryGet<>
将从当前绑定中获取服务类型。
kernel.Rebind<IAddressRepository>().To<AddressRepository>().InBackgroundJobScope()
.OnActivation(repo => repo
.Subscribe(kernel.TryGet<SyncTrackerDataEventObserver<Address, AddressRepository>>()
?? throw new ObserverBindingException("Address")));
(其中 ObserverBindingException
是我为此目的创建的自定义异常类型)。
我正在使用 Ninject 为 class 设置绑定,它是 IObservable
。
我已经设置了一个重新绑定以确保 IObservable
有它的 IObserver
订阅如下...
kernel.Rebind<IAddressRepository>().To<AddressRepository>().InRequestScope()
.OnActivation(repo => repo
.Subscribe(new SyncTrackerDataEventObserver<Address, AddressRepository>()));
这似乎工作正常,但实际上并不理想。 SyncTrackerDataEventObserver
会,当它不仅仅是一个存根时,它会拥有自己的依赖项。然后我们得到这个...
kernel.Rebind<IAddressRepository>().To<AddressRepository>().InRequestScope()
.OnActivation(repo => repo
.Subscribe(new SyncTrackerDataEventObserver<Address, AddressRepository>(new SyncTrackerRepository(new SyncDataSource))));
哎哟!!
此时我想做的是利用现有的绑定。我希望能够写出这样的东西(但这只是编造的..)
kernel.Rebind<IAddressRepository>().To<AddressRepository>().InRequestScope()
.OnActivation(repo => repo
.Subscribe(kernel.Resolve<ISyncTrackerDataEventObserver>()));
在不创建大量硬编码依赖项和破坏 IoC 范例的情况下实现此目标的正确方法是什么?
当我想出要看的地方时,这非常简单。 kernel.TryGet<>
将从当前绑定中获取服务类型。
kernel.Rebind<IAddressRepository>().To<AddressRepository>().InBackgroundJobScope()
.OnActivation(repo => repo
.Subscribe(kernel.TryGet<SyncTrackerDataEventObserver<Address, AddressRepository>>()
?? throw new ObserverBindingException("Address")));
(其中 ObserverBindingException
是我为此目的创建的自定义异常类型)。