2012-10-26 39 views
4

考慮下面的代碼如何使用相同的界面注入兩個或多個依賴關係?

public interface ISomeInterface 
{ 
    void DoSomething(); 
} 

public class A : ISomeInterface 
{ 
    public void DoSomething() { } 
} 

public class B : ISomeInterface 
{ 
    public void DoSomething() { } 
} 

然後一個使用2個接口類:

public class C : IC 
{ 
    protected ISomeInterface _dependency1; 
    protected ISomeInterface _dependency2; 

    public C (ISomeInterface dependency1, ISomeInterface dependency2) 
    { 
     _dependency1 = dependency1; 
     _dependency2 = dependency2; 
    } 
} 

我想在dependency2注入一個在依賴關係1和B。我知道我可以做這樣的事情:

builder.RegisterType<C>().As<IC>() 
    .WithParameter("dependency1", new A()) 
    .WithParameter("dependency2", new B()); 

但我知道有一種更好的方式與Autofac做到這一點。

+1

你試過一個數組或者IEnumerable 嗎? –

+0

可以工作,但想象一下,我有很多實現ISomeInterface的對象和大量的對象,只消耗一些對象。最糟糕的是,我將在未來實施一些。然後,在消費者中,我希望對ISomeInteefaces的數量保持透明。 whin ninject我可以在每個參數前面加一個名稱屬性,然後用該名稱進行綁定。我喜歡用Autofac做這樣的事情。 – Jordi

回答

2

當您註冊ISomeInterface植入你可以給them a name

containerBuilder.RegisterType<A>().Named<ISomeInterface>("A"); 
containerBuilder.RegisterType<B>().Named<ISomeInterface>("B"); 

然後您可以註冊C來解決它的參數使用定義的名稱:

containerBuilder.Register(c => 
    new C(c.ResolveNamed<ISomeInterface>("A"), 
     c.ResolveNamed<ISomeInterface>("B"))) 
    .As<IC>(); 

使用上述代碼即使某些參數不需要「已命名」註冊,也必須指定所有構造函數參數C

所以,如果你只是想指定您可以使用WithParameter的「命名」參數一起解析:

containerBuilder.RegisterType<C>().As<IC>() 
    .WithParameter((p, c) => p.Name == "dependency1", 
        (p, c) => c.ResolveNamed<ISomeInterface>("A")) 
    .WithParameter((p, c) => p.Name == "dependency2", 
        (p, c) => c.ResolveNamed<ISomeInterface>("B")); 
1

首先,爲什麼你想注入相同接口的兩個實例?它必須是區分它們的東西?

我的建議是你註冊兩個子接口,即。 ISomeInterface1:ISomeInterface ISomeInterface2:ISomeInterface並注入這兩個。那麼你不必處理命名參數。

+0

這將工作。但我並沒有在這裏尋找解決方案,我正在尋找最好的解決方案。我正在努力掌握Autofac :-) – Jordi

相關問題