2011-11-23 102 views
2

我正在嘗試構建一個使用插件的核心應用程序,以便核心永不改變,每次我們獲得新客戶端時,我們都會爲它們編寫一個模塊。我們使用新的客戶類實現了一個名爲IClientPlugin的接口。如何讓一個核心類調用一個客戶類?

這是使用Compact Framework 3.5和Windows Mobile 6.5.3。

所以這是我需要acheive:

這是一個倉庫管理系統。第一項任務是從卡車的產品中接收手持設備掃描條碼的條形碼。

當用戶點擊接收菜單項時,核心模塊就會啓動。

的核心方法是 - callClientMethod()

我知道客戶的名字,它是在登錄存儲在一個全局變量和類將是{clientname}.cs 幷包含一個名爲processReceiving()方法。

我知道如何實例化這個對象。

問題是:有沒有一種方法可以動態創建客戶端類的實例,而無需硬編碼case語句?

例如,假設我有2個客戶端Acme和Widgets。他們每個人都得到一個客戶端類,即Acme.csWidgets.cs

如果我登錄爲阿克米或小工具我想要的代碼,以動態創建客戶端類的實例,我的身份登錄,使核心代碼沒有改變因爲只要爲他們添加模塊,我就可以添加更多的客戶端。

僞例如:

var myClient = New (Clientname)(); 

這是可能的,或者有更好的設計方法,或者說是開關/ case語句neccessary邪?

+0

角括號會被系統所佔用,所以我將它改爲'{clientname} .cs'。不是一個C#程序員我不知道如果這是可以接受的指示樣板。 – Verbeia

+0

我想人們仍然會感謝佛貝拉。 –

+0

客戶類是否駐留在同一個程序集中? – misha

回答

1

您可以使用反射來動態創建對象。 加載類型或程序集有很多種方法。讓我們從一個簡單的一個:

Type clientType = Type.GetType("AssemblyName, TypeName"); 
IClientPlugin clientPlugin = 
        (IClientPlugin)Activator.CreateInstance(clientType);  

如果您的客戶端被命名爲myClient1和你有約定,你的組件被命名爲例如像Clients.ClientName.dll那麼你可以寫一個函數:

IClientPlugin CreatePluginInstance(string clientName) { 
    string typeName = string.Format("Clients.{0}, {0}", clientName); 
    Type clientType = Type.GetType(typeName); 
    IClientPlugin clientPluginInstance = 
         (IClientPlugin)Activator.CreateInstance(clientType);  
    return clientPluginInstance; 
} 

編輯

如果你的插件類都位於相同的組件,你的馬在項目中,可以簡化Type.GetType的號召,只指定類名:

Type.GetType(clientName); 
+0

謝謝,但有沒有辦法在dll的項目之外引用它們。我試圖避免建設完整的工廠,因爲有些年輕的開發人員將不得不保持這種尚未完全掌握先進.NET原則的開發人員。 –

+0

我不知道你在* dll的*以外是什麼意思。你能詳細說明一下嗎? – Jan

+0

是我引用的類不在dll中它在我正在工作的項目的子目錄中 –

0
var myClient = Activator.CreateComInstanceFrom("Acme.dll","Acme"); 

在這裏您可以參數化大會名稱和類型名稱。

+0

謝謝你,但有沒有辦法在dll之外的項目中引用它們。我試圖避免建設完整的工廠,因爲有一些年輕的開發人員必須保持這一點,但尚未完全掌握先進的.net原則 –

相關問題