2016-07-07 44 views
1

我想在不同的控制器中使用不同的接口。使用Autofac在兩個控制器中獲得不同的接口

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

我有兩個類實現兩個相同的接口。

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 
    }  
} 

兩個控制器:

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設置:

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

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

我怎樣才能得到SmsSender中的HomeController和MailSender在Home2Controller?

+0

您在使用其他IOC容器打開?我相信Ninject具有此功能 –

+1

[依賴注入類型選擇]的可能重複(http://stackoverflow.com/questions/34329203/dependency-injection-type-selection) – NightOwl888

+0

[有關於此主題的完整常見問題。]( http://autofac.readthedocs.io/en/latest/faq/select-by-context.html) –

回答

3

當您註冊組件時,您可以使用WithParameter方法告訴Autofac選擇哪種依賴關係。

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

爲了避免new XDependency代碼,讓Autofac創建的依賴,可以解決一個名爲註冊。

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

,並使用c.ResolveNamed<IDependency>("X")

另一種解決辦法是讓組件選擇它希望使用IIndex<TKey, TService>哪些依賴解決。要使用此功能,您必須將您的IDependency註冊爲已命名的註冊並注入IIndex<String, IDependency>

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

    private readonly IDependency _dependency; 
} 

欲瞭解更多信息,你可以看看FAQ上autofac文件:How do I pick a service implementation by context

0

你不能。 Autofac將無法找出差異。最好把它們分成兩個不同的接口,把你需要的接口注入控制器。從設計角度來看,依賴性也更清晰。如果有需要,兩個接口都可以實現IMessenger。

相關問題