由於您使用合同的名稱,你可以在特定參數的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指南包括了很多有用的例子。
不知道,謝謝。事情是我需要它從應用程序設定來配置,所以我可以在運行時切換,如果我採取上述辦法我需要重新編譯應用程序 – klashagelqvist