I have global flags which enable/disable features. I’d like to inject some dependencies depending on some flag. Some features require classes which are heavily constructed so I want to inject null if the value of the flag is false and the actual dependency otherwise. Ninject doesn’t allow injecting null. Are there any other options?
Update: constructor arguments can be decorated with OptionalAttribute attribute. In this case null is injected if there is no corresponding binding found. There is a problem here: I can’t verify if target class can be properly constructed. I have a test for each public dependency which verifies if it can be constructed successfully. In case if the value of the flag is true I will not be able to find the error when the dependency decorated with the OptionalAttribute attribute, cannot be constructed properly. I’d like to manage it on binding level only.
You can vary the injection behaviour by binding using a factory method (i.e.
ToMethod), and it’s possible to allow injection of nulls by configuring the container’sAllowNullInjectionsetting.Another alternative would be to use a factory method and supply a lightweight dummy object instead of your heavy-weight class. If you are using interfaces this would be straightforward, just have implementations of the interface that do nothing. You could even use a mocking framework such as FakeItEasy to construct these dummies for you. The benefit here, is that the dummy makes the special behaviour transparent to clients i.e. clients do not need to check for
null, etc.An example of using a factory method, plus
AllowNullInjectionand nulls:And an example where a lightweight object is substituted depending on the flag: