L'injection de plusieurs implémentations avec l'injection de Dépendance

Je suis actuellement en train de travailler sur un ASP.NET Projet de Base et que vous voulez utiliser intégré dans l'Injection de Dépendance (DI) de la fonctionnalité.

Bien, j'ai commencé avec une interface:

ICar
{
    string Drive();
}

et souhaitez mettre en œuvre la ICar interface à plusieurs reprises comme

public class BMW : ICar
{
    public string Drive(){...};
}

public class Jaguar : ICar
{
    public string Drive(){...};
}

et ajoutez la ligne suivante dans le Startup classe

public void ConfigureServices(IServiceCollection services)
{
     //Add framework services.
     services.AddMvc();
     services.AddTransient<ICar, BMW>(); 
     //or 
     services.AddTransient<ICar, Jaguar>();
 }

Maintenant, je dois prendre une décision entre les deux implémentations et mes décidé de classe sera fixé dans chaque constructeur qui a besoin d'une ICar mise en œuvre. Mais mon idée était de dire, si la demande de Contrôleur est BMWController, puis utilisez BMW mise en œuvre ou l'utilisation de Jaguar si le JaguarController est demandé.

Autrement DI ne faites pas de sens pour moi. Comment puis-je traiter correctement ce problème?

Pour mieux comprendre mon problème, jetez un oeil à cette image: https://media-www-asp.azureedge.net/media/44907/dependency-injection-golf.png?raw=true
Comment la résolution de dépendances de travail et où puis-je le mettre en place ASP.NET Core?

Dans l'Unité, il est possible de faire quelque chose comme ceci
container.RegisterType<IPerson, Male>("Male");
container.RegisterType<IPerson, Female>("Female");

et appelez le type correct comme ça

[Dependency("Male")]IPerson malePerson
Je pense que cette idée est fausse. Si vous avez BMWController que les besoins concrets de voiture de la mise en œuvre, l'injection de la Cisa a pas de sens - que la magie de la DI - vous dire "donnez-moi de la mise en œuvre de la Cisa" et ne se soucient pas ce qu'il est. J'avais préparer une autre interface: interface IBmwCar: ICar { ... } et à l'injecter dans BMWController. Autre idée est de créer de l'usine. f.e class CarFactory : ICarFactory { ICar GimmeCar<TController>() } où vous avez mappé type de contrôleur à la mise en œuvre concrète.
Merci pour la réponse.
N'est-il pas un débordement d'Interfaces si j'ai de l'utilisateur quelque chose comme IBmwCar : ICar pour toutes les marques je veux le mettre en œuvre? J'ai juste de la Voiture en tant que méthode, et n'aura pas d'autres. Eh bien, je voudrais créer puis IBMW, IJaguar... avec la même signature comme ICar et utiliser une instruction de ce genre pour chaque marque, j'ai mis en œuvre: services.AddTransient<IJaguar, Jaguar>(); Évidemment, je pourrais utiliser l'Usine de Motif, mais n'est-il pas une solution pour faire mon travail avec DI?
une chose à propos de la DI est que vous pouvez prendre une dépendance sur IEnumerable<ICar>, et obtenir toutes les réalisations qui ont été enregistrées, si aucune implémentations ont été enregistrés, vous obtenez une liste vide plutôt que l'échec à résoudre. Donc, si ICar a une certaine propriété d'identifiant vous pourrez trouver celui dont vous avez besoin dans la liste.

OriginalL'auteur DrScrum Milestone | 2016-12-03