i'm using guice inject dependencies.
i have provider:
public class requesturlrepository implements provider<irequesturlrepository> { @singleton @override public irequesturlrepository get() { irequesturlrepository answer = null; if (system.getproperty("").equals(routeorcostrequest.cost.tostring())){ answer = new costrequesturlrepository(...); } else { answer = new routingrequesturlrepository(...); } return answer; } }
how can use guice injector fill new costrequesturlrepository(...);
, new routingrequesturlrepository(...)
when it's in provider?
if not possible, how can init them without manually creating ctor's params?
providers can accept @inject
-annotated constructors , fields, , guice's built-in bindings let inject both injector
, provider key injector can provide (e.g. provider<costrequesturlrepository>
).
@singleton public class requesturlrepository implements provider<irequesturlrepository> { @inject provider<costrequesturlrepository> costrepositoryprovider; @inject provider<routingrequesturlrepository> routingrepositoryprovider; @inject injector injector; @override public irequesturlrepository get() { irequesturlrepository answer = null; if (system.getproperty("").equals(routeorcostrequest.cost.tostring())){ return costrepositoryprovider.get(); } else { return routingrepositoryprovider.get(); } // alternatively: return injector.getinstance(class.forname(system.getproperty(""))); } }
note @singleton
annotation goes on class, not method; per guice mailing list "scope annotations apply providers whole, annotating get() method @singleton erroneous , ignored." (link).
ideally, rather injecting entire injector, should inject each provider; should make easier see system's dependencies, , you're relying less on guice , more on general jsr330 annotations. however, if have instantiate arbitrary class based on name or class literal in variable, injecting injector way go.
Comments
Post a Comment