2016-07-06 15 views
1

Ich habe zwei MVC-Controller.Wie löst man verschiedene Dienste in verschiedenen Controllern auf?

Beide Controller haben eine Abhängigkeit von der IFileContainer Schnittstelle.

In einem Controller möchte ich FsFileContainer auflösen und in zweiten Controller möchte ich FtpFileContainer auflösen.

Register:

serviceCollection.AddTransient<IFileContainer, FsFileContainer>(); 
    serviceCollection.AddTransient<IFileContainer, FtpFileContainer>(); 

Wie Behälter in diesem Fall lösen?

+2

Bitte, MVC6-Tags nicht mehr verwenden. Es ist für eine zukünftige Version von ASP.NET MVC basierend auf dem alten Webstack (MVC5). ASP.NET Core ist eine komplett neue und inkompatible, portable Version, die auf .NET Core basiert. Verwenden Sie stattdessen Tags [tag: asp.net-core-mvc] und/oder [tag: asp.net-core] und Ihre Frage wird eher von Leuten gefunden, die Ihnen bei dem Problem helfen können. Zweitens, benutze keinen dnx mehr, es wird nicht mehr entwickelt. Die neuen Versionen funktionieren nur mit der Toolkette dotnet-cli, die Sie hier finden https://www.microsoft.com/net/core#windows. Upgrade auf 1.0 RTM so schnell wie möglich – Tseng

Antwort

2

Der einfachste Weg besteht darin, stattdessen eine Factory zu verwenden, da der ASP.NET Core IoC Container keine benannten Abhängigkeiten unterstützt oder einen IoC-Container eines Drittanbieters verwendet, der dies unterstützt.

public class FileContainerFactory : IFileContainerFactory 
{ 
    private readonly IServiceProvider provider; 
    public class FileContainerFactory(IServiceProvider provider) 
    { 
     this.provider = provider; 
    } 

    public IFileContainer CreateFileSystemContainer() 
    { 
     // resolve it via built in IoC 
     return provider.GetService<FsFileContainer>(); 
    } 

    public IFileContainer CreateFtpContainer() 
    { 
     // resolve it via built in IoC 
     return provider.GetService<FtpFileContainer>(); 
    } 
} 

dann die IFileContainerFactory in Ihrem Controller injizieren.

Eine Alternative ist Ihre Schnittstellen mit einem Marker-Schnittstelle markieren und registrieren/injizieren diese

// It defines no new methods or properties, just inherits it and acts as marker 
public interface IFsFileContainer : IFileContainer {} 
public interface IFtpFileContainer : IFileContainer {} 

public class FsFileContainer : IFsFileContainer 
{ 
    ... 
} 

in Startup.cs

services.AddTransient<IFsFileContainer, IFileContainer>(); 
services.AddTransient<IFtpFileContainer, IFileContainer>(); 
+1

Ich würde die erste Option nicht empfehlen. Die Verwendung eines Service-Locator-Musters ist nicht sehr nett. Siehe hier: http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/ –

+1

@JamieR: Factory-Muster ist kein Service-Locator, der Provider innerhalb wird vom IoC-Framework injiziert (anstatt die Container in Ihre Dienste oder haben eine statische Klasse für die Auflösung), daher ist es nicht Abhängigkeiten wie Service Locator versteckt. Die Schnittstelle kann für Komponententests und die gebräuchlichste Art, Objekte zu instanziieren, die Laufzeitparameter erfordern, verspottet werden. Vergessen Sie auch nicht, dass die meisten Factory-Implementierungen nicht Teil der Geschäfts-/Domänenebene sind, sondern zur Anwendungsebene gehören und die Anwendungsdienste den IoC-Container kennen können. Domain und Infrastruktur sollten nicht – Tseng

+1

Und ziemlich lustig zitieren Sie Mark Seemann, wie er ein Verfechter des abstrakten Fabrikmusters ist. http://stackoverflow.com/questions/2045904/dependency-inject-di-friendly-library/2047657#2047657. Die dritte Alternative besteht natürlich darin, ein Fassadenmuster zu verwenden und beide Instanzen als Eigenschaften bereitzustellen oder das Strategie-Muster zu verwenden. Ohne weitere Informationen ist es schwierig, konkrete Strategien vorzuschlagen, da wir nicht wissen, ob OP die Kontrolle über die Implementierungen von Implementierungen von Drittanbietern hat, dann kann es schwierig sein, eine Markierungsschnittstelle zu erzwingen, da dies die dritte Partei erfordern würde Aktualisieren Sie die Implementierung – Tseng

Verwandte Themen