2013-07-01 32 views
1

如果我有相同的接口的多種實現成分選擇執行

[Export("DALREMOTE", typeof(IDAL))] 
[PartCreationPolicy(CreationPolicy.Shared)] 
public class DAL : IDAL 

[Export("DALLOCAL", typeof(IDAL))] 
[PartCreationPolicy(CreationPolicy.Shared)] 
public class DAL : IDAL 

是存在的程序選擇模塊的構造作爲標準使用哪一個實現任何方式。

[ImportingConstructor] 
public ShellViewModel(IDAL dal........ 

進出口使用的PRISM/MEF引導程序和我,雖然我也許可以把它放在那裏

回答

1

由於您使用合同的名稱,你可以在特定參數的ImportAttribute的一部分指定的協定名稱。

下面是使用「DALLOCAL」合同名的例子:

[ImportingConstructor] 
public ShellViewModel([Import("DALLOCAL")]IDAL dal........ 

ImportAttribute的可以用來裝飾參數以及作爲屬性。

因爲,根據你的評論,你不想使用合同的名稱,並希望能夠選擇在運行時從某種應用程序配置的實現,你可以使用導出元數據。以下是使用弱元數據的示例:

[Export("DALREMOTE", typeof(IDAL))] 
[ExportMetadata("Tag", "DALREMOTE")] 
[PartCreationPolicy(CreationPolicy.Shared)] 
public class DAL : IDAL 

[Export("DALLOCAL", typeof(IDAL))] 
[ExportMetadata("Tag", "DALLOCAL")] 
[PartCreationPolicy(CreationPolicy.Shared)] 
public class DAL : IDAL 

請注意,「標記」是任意鍵。另外請注意,如果您在程序的其他部分需要指定合同,您可以保留指定合同。

構造變爲:

[ImportingConstructor] 
public ShellViewModel([ImportMany]IEnumerable<Lazy<IDAL, IDictionary<string, object>>> dals) 
{ 
    if (dals == null) throw new ArgumentNullException("dals"); 

    //Get the tag from your apps configuration. 
    string tagFromConfiguration = ........ 

    _dal = dals.Where(l => l.Metadata["Tag"].Equals(tagFromConfiguration)).Single().Value; 
} 

主要這裏的區別是,而不是一個單一IDAL,IDALs序列注入。然後在.ctor中,你將不得不選擇你想要的IDAL。請注意,如果有一個單一的出口IDAL與特定的標籤值使用Enumerable.Single纔會工作。

從MEF的Codeplex上的文檔的Exports and Metadata指南包括了很多有用的例子。

+0

不知道,謝謝。事情是我需要它從應用程序設定來配置,所以我可以在運行時切換,如果我採取上述辦法我需要重新編譯應用程序 – klashagelqvist