2011-01-20 4 views
0

La réponse simple est bien sûr d'inclure une méthode de démarrage sur l'interface de service.Conception de l'interface de démarrage du service

interface Service { 
    void start(); 
    OperationResult operation(parameters); 
    ... 
} 

Bien sûr, sux parce que la plupart des utilisateurs du service ne veulent pas ou se soucient de démarrage du service qu'ils veulent juste utiliser des méthodes telles que le fonctionnement.

Comment pourriez-vous résoudre ce problème? J'ai une solution simple qui a une limitation majeure sans polluer l'interface du Service, donc je voudrais entendre des propositions de peuples.

Répondre

1

S'il est nécessaire de démarrer un service, puis faire des choses avec elle, puis se terminent peut-être le service, il devrait y avoir un objet dont la fonction est simplement de démarrer le service et la fourniture d'un objet qui peut ensuite être utilisé pour faire des choses avec le service, y compris le terminer (la dernière action - probablement mieux gérée via IDisposable - devrait invalider l'objet "do-stuff").

0

Quelques façons:

  • commencer à chaque fois qu'il se construit
  • jeter une exception à partir des méthodes de fonctionnement si le service ne démarre pas, ce qui indique une mauvaise utilisation
  • démarrer automatiquement à partir de chaque méthode, si elle n'est pas démarrée
+0

Alors, quelle est votre réponse? Vous avez choisi trois stratégies différentes qui sont incompatibles, et pourquoi? –

+0

@mP c'est à vous de choisir, parce que vous voyez toute l'image. Je n'ai que les informations limitées que vous avez fournies. – Bozho

0

Votre question se pose parce que vous mélangez des problèmes d'implémentation (méthode start(), par exemple) avec les actions (méthode operation()). Start est un problème d'implémentation car vous pouvez créer une instance pour chaque appelant ou vous pouvez avoir un singleton (comme dans les instances mises en cache). L'appelant ne devrait pas avoir à appeler la méthode du tout. En fait, si vous conservez la méthode start et changez votre implémentation en singleton demain, le code peut cesser de fonctionner pour les clients existants. IMO, vous devriez vous débarrasser de la méthode de démarrage de cette interface et laisser l'appelant s'inquiéter de déléguer la tâche que votre méthode d'opération fait le mieux.

Si vous appuyez sur la méthode de démarrage (une étape d'optimisation qui n'a rien à voir avec l'interface) dans votre implémentation, vous pouvez résoudre le problème de plusieurs façons. Par exemple,

a. appelez start() s'il n'a pas été appelé auparavant dans la méthode operation(). Vous devrez gérer les problèmes de synchronisation. b. appelez start() dans le constructeur de votre objet d'implémentation et faites-le avec.

etc.

+0

Est-ce que le démarrage ne peut pas être retardé? –

+0

@mP Si la méthode de démarrage ne peut pas être retardée, vous pouvez soit être gourmand et l'ignorer dans votre constructeur, soit arriver à une stratégie paresseuse qui débute à un moment donné entre l'initialisation et l'utilisation de la méthode. Tout dépend de votre implémentation quant à comment et quand vous allez invoquer démarrer. – guidothekp

0

Si vous ne voulez pas que le consommateur se soucie d'appeler une startup. Vous pouvez envisager de déléguer votre code de démarrage en interne à une méthode protégée qui paresseuse initialise ce que vous faites actuellement au démarrage. Tels que:

protected MyService getMyService() { 
    if(myService == null) { 
     myService = new MyServiceImpl(); 
     myService.startup(); 
    } 
    return idpPersistence; 
} 

méthodes d'appel comme celui-ci:

public String findByThis(String tag, String key) { 
    return getMyService().findThat(MyClass.class, column, key); 
} 

Bien sûr, a quelques compromis. Si votre service est cher au démarrage, alors le premier appelant prend bien ce coup d'abord.

Une autre option consiste à les implémenter en utilisant un bloc {} statique, mais bien sûr, cela n'est pas toujours très facile à tester.En outre, faire vos routines de démarrage sur la constuction de l'objet, qui viole parfois aussi les modèles IOC. Je suis allé avec l'ajout d'une interface de service parce que les clients que j'avais étaient internes, et je voulais tous les services initialisés et prêts au démarrage.

+0

merci pour la réponse, mais quelle stratégie choisiriez-vous. Ce qui dans un sens général est le meilleur la plupart du temps. –

Questions connexes