2016-07-07 10 views
1

Ich möchte verschiedene Schnittstelle in verschiedenen Controller verwenden.Get unterschiedliche Schnittstelle in zwei Controller mit Autofac

public interface IMessenger { 
    Id {get; set;} 
    void Send(); 
} 

Ich habe zwei Klassen implementieren zwei gleiche Schnittstelle.

public class SmsSender : IMessenger { 
    public Id {get; set;} 
    public void Send() { 
     //logic here 
    }  
} 

public class MailSender : IMessenger { 
    public Id {get; set;} 
    public void Send() { 
     //logic here 
    }  
} 

mit zwei Controllern:

public class HomeController : Controller { 

    private readonly IMessenger _messenger; 

    public HomeController(IMessenger messenger) { 
     _messenger = messenger; 
    } 
} 


public class Home2Controller : Controller { 

    private readonly IMessenger _messenger; 

    public HomeController(IMessenger messenger) { 
     _messenger = messenger; 
    } 
} 

Autofaq Setup:

builder.RegisterType<MailSender>().As<IMessenger>().InstancePerLifetimeScope(); 

builder.RegisterType<SmsSender>().As<IMessenger>().InstancePerLifetimeScope(); 

Wie kann ich SmsSender in Homecontroller erhalten und Mailsender in Home2Controller?

+0

Sind Sie offen andere IOC-Container in Verwendung? Ich glaube, dass Ninject diese Eigenschaft hat –

+1

Mögliches Duplikat von [Dependency injection type-selection] (http://stackoverflow.com/questions/34329203/dependency-injection-type-selection) – NightOwl888

+0

[Es gibt eine ganze FAQ zu diesem Thema.] (http://autofac.readthedocs.io/de/latest/faq/select-by-context.html) –

Antwort

3

Wenn Sie Ihre Komponente registrieren, können Sie Autofac angeben, welche Abhängigkeit mit der Methode WithParameter auszuwählen ist.

builder.RegisterType<Service>() 
     .As<IService>() 
     .WithParameter((pi, c) => pi.ParameterType == typeof(IDependency), 
         (pi, c) => new XDependency()); 

Um die new XDependency Code zu vermeiden und lassen Autofac die Abhängigkeit erstellen, können Sie eine benannte Registrierung beheben.

builder.RegisterType<XDependency>().Named<IDependency>("X"); 
builder.RegisterType<YDependency>().Named<IDependency>("Y"); 

und lösen es c.ResolveNamed<IDependency>("X")

Eine andere Lösung wäre mit der Komponente lassen wählen, welche Abhängigkeits es will IIndex<TKey, TService> verwenden. Um dies zu verwenden, müssen Sie Ihre IDependency als benannte Registrierungen registrieren und IIndex<String, IDependency> injizieren.

public class Service 
{ 
    public Service(IIndex<String, IDependency> dependencies) 
    { 
     this._dependency = dependencies["X"]; 
    } 

    private readonly IDependency _dependency; 
} 

Für weitere Informationen können Sie in der FAQ auf der Autofac Dokumentation einen Blick: How do I pick a service implementation by context

0

Sie können nicht. Autofac wird nicht in der Lage sein, die Unterschiede herauszufinden. Besser, sie in zwei verschiedene Schnittstellen zu trennen, injizieren Sie die, die Sie brauchen, in die Controller. Vom Design her ist die Abhängigkeit auch klarer. Bei Bedarf können beide Schnittstellen IMessenger implementieren.

Verwandte Themen