i can use something like this. but if i have 25 commands ?, i have to
pass 25 parameters in the constructor. ?
public class CommandProviderFactory {
private Provider<CommandX> commandXProvider;
private Provider<CommandY> commandYProvider;
@Inject public CommandProviderFactory(Provider<CommandX>
commandXProvider,
Provider<CommandY> commandYProvider) {
}
public Command create(String commandName) throws Exception {
if(commandName.equals("commandX"))
return commandXProvider.get();
else if(commandName.equals("commandY"))
return commandYProvider.get();
else
throw new Exception("command not found");
}
}
On Apr 21, 3:35 pm, ale <[email protected]> wrote:
> Thanks Oliver.
>
> but i don't understand how assistedinject can help me.
>
> can you help me fix this example code.
>
> /* Main */
> public class Main {
> public static class MainModule extends AbstractModule {
> @Override protected void configure() {
>
> bind(RemoteServiceX.class).to(RemoteServiceXImpl.class);
>
> bind(RemoteServiceY.class).to(RemoteServiceYImpl.class);
> }
> }
> public static void main(String[] args) {
> Injector inejector = Guice.createInjector(new MainModule());
> Test test = inejector.getInstance(Test.class);
> Command command = test.processRequest("commandX");
> command.execute();
> }}
>
> public class Test {
> public Command processRequest(String commandName) {
> if( commandName.equals("commandX") )
> return new CommandX(?); //HERE IS THE PROBLEM
> else if ( commandName.equals("commandX") )
> return new CommandY(?); //HERE IS THE PROBLEM
> return null;
> }
>
> }
>
> /* Command */
> public interface Command {
> void execute();
>
> }
>
> public class CommandX implements Command {
> private RemoteServiceX service;
> private String runtimeParameter;
>
> @Inject public CommandX(RemoteServiceX service, String
> runtimeParameter) {
> this.service = service;
> this.runtimeParameter = runtimeParameter;
> }
>
> @Override public void execute() { /*TODO: implements this method*/ }
>
> }
>
> public class CommandY implements Command{
> private RemoteServiceX service;
> private String runtimeParameter;
>
> @Inject public CommandY(RemoteServiceX service, String
> runtimeParameter) {
> this.service = service;
> this.runtimeParameter = runtimeParameter;
> }
>
> @Override public void execute() { }
>
> }
>
> /* Services */
> public interface RemoteServiceX {
> public void specificMethod1OfServiceX();
> public void specificMethod2OfServiceX();
>
> }
>
> public class RemoteServiceXImpl implements RemoteServiceX {
> @Override public void specificMethod1OfServiceX() {/*TODO: implements
> this method*/}
> @Override public void specificMethod2OfServiceX() {/*TODO: implements
> this method*/}
>
> }
>
> public interface RemoteServiceY {
> public void specificMethod1OfServiceY();
> public void specificMethod2OfServiceY();
>
> }
>
> public class RemoteServiceYImpl implements RemoteServiceY {
> @Override public void specificMethod1OfServiceY() {/*TODO: implements
> this method*/}
> @Override public void specificMethod2OfServiceY() {/*TODO: implements
> this method*/}
>
> }
>
> On Apr 21, 1:38 pm, Olivier Grégoire <[email protected]> wrote:
>
> > Hello,
>
> > You must create a factory instead of using a Provider. To help you, the
> > extension AssistedInject exists.
>
> > More details in the
> > wiki:http://code.google.com/p/google-guice/wiki/AssistedInject
>
> > Regards,
> > Olivier
>
> > 2009/4/21 ale <[email protected]>
>
> > > How can i do this.?
>
> > > public class CommandProvider implements Provider<Command> {
>
> > > public Command get(runtimeValue1, runtimeValue2) {
>
> > > if(runtimeValue1.equals( "commandX" )) {
>
> > > return new FooCommandX( runtimeValue2 );
>
> > > } else if (runtimeValue1.equals( "commandY" )) {
>
> > > return new FooCommandY(runtimeValue2);
>
> > > } else if (runtimeValue1.equals( "commandZ" )) {
>
> > > return new FooCommandZ(runtimeValue2);
>
> > > } else {
> > > throw new RuntimeException("...."); //For this i
> > > know that i should use ThrowingProviders.
> > > }
>
> > > }
>
> > > }
>
> > > Thanks.
>
> > --
> > Olivier Grégoire
> > Boulevard De Smet De Naeyer 627A
> > 1020 Bruxelles
> > Tél: +32.486.74.09.49
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"google-guice" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/google-guice?hl=en
-~----------~----~----~----~------~----~------~--~---