Je commence enfin à me mouiller les pieds avec Dependency Injection (longtemps attendu); J'ai commencé à jouer avec Unity et j'ai eu un problème avec le schéma de stratégie. Je peux utiliser le conteneur pour me rendre des implémentations spécifiques d'une stratégie basée sur un nom, mais ce que je ne vois pas, c'est comment je suis censé avoir la bonne stratégie dans le contexte. Illustrons sur un exemple simple: le contexte est une voiture, qui a un IEngine (la stratégie), avec 2 implémentations, FastEngine et SlowEngine. Le code regarderait le long de ces lignes:Modèle de stratégie et injection de dépendances en utilisant Unity
public interface IEngine
{
double MaxSpeed
{
get;
}
}
internal class FastEngine:IEngine
{
public double MaxSpeed
{
get
{
return 100d;
}
}
}
internal class SlowEngine:IEngine
{
public double MaxSpeed
{
get
{
return 10d;
}
}
}
public class Car
{
private IEngine engine;
public double MaximumSpeed
{
get
{
return this.engine.MaxSpeed;
}
}
public Car(IEngine engine)
{
this.engine = engine;
}
}
Mon problème est le suivant: comment dois-je aller sur instancier une voiture rapide ou une voiture lente? Je peux utiliser le conteneur pour me fournir chaque mise en œuvre, et je peux définir une mise en œuvre « par défaut » à utiliser:
IUnityContainer container = new UnityContainer();
container.RegisterType<IEngine, FastEngine>();
container.RegisterType<IEngine, FastEngine>("Fast");
container.RegisterType<IEngine, SlowEngine>("Slow");
var car = container.Resolve<Car>();
Assert.AreEqual(100, car.MaximumSpeed);
mais ce que je voudrais est d'être en mesure de demander une voiture avec une mise en œuvre spécifique du stratégie - quelque chose comme
var car = container.Resolve<Car>(??? use "Fast" or "Slow ???);
Puis-je utiliser le conteneur pour faire cela? Ou devrais-je écrire une usine qui utilise le conteneur? Toute orientation serait appréciée - je ne suis pas sûr que je pense à ce sujet!
Merci, réponse perspicace. J'utilise le modèle de stratégie, avec de multiples stratégies échangées à l'exécution, beaucoup; par défaut je ferais ce que tu décrirais (Factory ou Builder), mais j'ai vu beaucoup de pattern de stratégie et de DI, et bien que cela puisse aider. D'après ce que vous dites, il semble qu'un conteneur ne serait que marginalement utile. – Mathias
Je pense toujours que les conteneurs sont extrêmement utiles. Dans ces cas, ils injecteraient simplement l'usine au lieu de la stratégie, mais je suppose que vous pourriez toujours choisir d'implémenter l'usine avec le conteneur ... –
Oh, je pense que je vois ce que vous voulez dire; plutôt que de retourner la bonne voiture, retournez la bonne usine en fonction du moteur. Dans tous les cas, votre commentaire sur: les conteneurs utilisés pour fournir une seule implémentation pour une abstraction était très utile; C'est cohérent avec les exemples que j'ai vus, qui sont orientés vers la configuration. Dans ce cadre, vous pouvez avoir un schéma de stratégie, mais un déploiement particulier n'aura qu'une seule implémentation configurée. – Mathias