1

Nehmen wir an, ich folgende Situation haben:Sollte ich Fabriken schreiben oder bedingte Registrierung in DI verwenden, wenn ich Abhängigkeiten mit verschiedenen Implementierungen auf verschiedenen Typen auflösen möchte?

Ich habe Downloader Typ, der drei Abhängigkeiten wie IDep1, IDep2, IDep3. Diese Abhängigkeiten haben 2 Implementierungen. Für IDep1 ist Dep1Impl1 und Dep1Impl2 etc. Je nach Typ, der Downloader als Abhängigkeit hat, möchte ich Downloader mit verschiedenen Implementierungen IDep auflösen.

Was ist die beste Vorgehensweise, um so etwas zu tun? Es ist besser, eine Fabriken für IDep 's zu schreiben und Downloader mit optimalen Parametern oder versuchen Sie bedingte Registrierung in DI? Oder gibt es dafür eine bessere Lösung?

EDIT:

Zur Verdeutlichung Downloader ist die Abhängigkeit in ASP.NET MVC-Controller. Auf verschiedenen Controllern möchte ich verschiedene Implementierungen von IDep in Downloader.

EDIT2:

Ich weiß, in der Kompilierung welche Abhängigkeiten für jeden Downloader gehen sollte. Und diese Abhängigkeiten sind für jeden Controller festgelegt, wo Downloader Abhängigkeit ist. Also ich denke, Scott ist amwser die beste Lösung für diese Art von Problem.

+0

Wie bestimmen Sie, welche Implementierung von 'Downloader' für jeden Controller benötigt wird? Wenn es sich auf einige bekannte Parameter bezieht, auf die Sie zur Laufzeit Zugriff haben, kann eine abstrakte Factory eine gute Wahl sein. Wenn es sich nur um ein deklaratives Szenario handelt, in dem ControllerA immer die gleiche Implementierung erhält und ControllerB immer eine andere erhält, dann hat Scott Hannen die beste Option. –

+1

Die richtige Antwort hängt stark vom jeweiligen Anwendungsfall ab. Bitte beschreiben Sie, was bestimmt, wer welchen Downloader bekommt. Basiert dies auf der Anwendungskonfiguration? Haben Sie mehrere verschiedene Downloader in der gleichen Anwendung? Funktionieren die Konsumenten von Downloader immer noch korrekt, wenn sie einen anderen Downloader bekommen? – Steven

+0

Haben Sie [diese FAQ?] (Http://autofac.readthedocs.org/en/latest/faq/select-by-context.html) gesehen? –

Antwort

1

Das Problem dort, wenn ich richtig verstehe, ist, dass Sie wollen mehr als eine Klasse auf Downloader abhängen. Und die Klasse, die von Downloader abhängt bestimmt, welche Art von Abhängigkeit Downloader empfängt.

I ist eine gute Lösung für das nicht eine Fabrik denken, weil

  • Die Klassen, die auf Downloader abhängen sollte nicht über die internen Abhängigkeiten von Downloader wissen
  • Downloader sollte nicht wissen, was in Abhängigkeit auf es in der Lage sein, dieses Detail zu einer Fabrik zu übergeben.

Sie können das tun, aber es würde gewunden werden. Sie würden eine Fabrik Fabrik benötigen.

Es klingt wie, was Sie wollen, ist vordefinierte Kompositionen von Downloader - eine, die von einer Implementierung abhängt, eine andere als hängt von einer anderen Implementierung.

Sie können das tun mit Windsor (ähnlich für Unity) wie folgt aus:

container.Register(
    Component.For<IDownloaderDependency,DownloaderDependencyTypeA> 
     .Named("DownloaderDependencyTypeA"), 
    Component.For<IDownloader,Downloader> 
     .Named("DownloaderForClassA") 
     .DependsOn(Dependency.OnComponent(
      typeof(IDownloaderDependency), 
      "DownloaderDependencyTypeA")), 
    Component.For<ClassA> 
     .DependsOn(Dependency.OnComponent(
      typeof(IDownloader), 
      "DownloaderForClassA")) 
) 

Also, was Sie tun, einen Weg, um zu definieren, dass Downloader zusammengesetzt sein kann, einen bestimmten Abhängigkeitstyp verwendet wird, und dann sagen: diese Zusammensetzung von Downloader für ClassA zu verwenden.

Auf diese Weise ClassA bekommt das richtige Downloader mit den richtigen Abhängigkeiten, aber aus seiner Sicht alles, was es weiß, ist, dass es auf Downloader abhängt.Es ist nicht bekannt (und sollte nicht) über die Abhängigkeiten innerhalbDownloader.

Verwandte Themen