2009-07-17 72 views
6

我有2個組件:MEF(託管擴展框架)做「鴨」打字嗎?

大會1:

interface IWeapon { 
    int Might { get; } 
} 

[Export("sword")] 
public class Sword : IWeapon { 

    public int Might { 
     get { return 10; } 
    } 
} 

大會2:

interface IWeapon { 
    int Might { get; } 
} 

var catalog = new AssemblyCatalog(typeof(Ninja.Sword).Assembly); 
var container = new CompositionContainer(catalog); 
// not allowed to use the IWeapon def in assembly 2 
var sword = container.GetExportedValue<IWeapon>("sword"); 

我知道如何得到這個工作。我可以向MEF(託管擴展框架)請求該對象,或者讓它導出正確的IWeapon,而不僅僅是按名稱導出對象。

如果所有接口點都實現了,MEF可以爲我執行「鴨」打字並返回一個代理對象嗎?

回答

5

我認爲它在MEF的早期版本中(通過動態地爲該類發佈IL並返回它),現在它被刪除了。這真的沒有道理。畢竟,你的課程應該是,設計通過特定的接口來實現這個附加功能。如果你可以爲它們添加諸如Export屬性的東西,你應該完全能夠在你的類上實現接口。

+0

我看到的是版本的問題,如果你的底座組件的變化版本,所有的擴展可能需要重新編譯。 – 2009-07-17 00:39:02

+1

我想通過將接口移動到單獨的程序集來解決該問題。該組件的版本只有在實際合同更改時纔會更改。 – 2009-07-17 00:40:31