您好我有一個類庫,它執行方法,並有很多不同的類,它使用方法調用參數... 我創建一個wcf包裝這個類庫。但我沒有權限更改類庫。Wcf datacontract類中的類,我不能修改
現在我的問題是我怎麼能公開這些類作爲數據合同/ datammbers輕鬆..?
我有大約100個不同的類,我需要這些方法。
感謝
您好我有一個類庫,它執行方法,並有很多不同的類,它使用方法調用參數... 我創建一個wcf包裝這個類庫。但我沒有權限更改類庫。Wcf datacontract類中的類,我不能修改
現在我的問題是我怎麼能公開這些類作爲數據合同/ datammbers輕鬆..?
我有大約100個不同的類,我需要這些方法。
感謝
如果您確實無法更改庫,那麼我相信您通過WCF公開類的唯一選擇是爲每個方法創建包裝對象。我會考慮爲此任務編寫一個代碼生成器。
您可以反映您想要公開的程序集中的一組類型,以獲取所需的類型元數據信息。
您可以使用類似t4模板(VS 2008及以上版本)和T4 Toolbox的東西來創建代碼生成器來爲您編寫代碼。一旦發生器完成,如果你的庫改變了,應該很容易再次運行。修復代碼生成器並重新運行它也很容易。
我提到的其他選擇只是爲了完整性,但其中有一些棘手的問題將是反彙編和修補有問題的代碼。你可以使用像ildasm這樣的東西來轉儲程序集的il,添加必要的WCF歸屬,然後用ilasm重新組裝。然而,這個過程可能會很容易出錯,只要程序集發生變化,您就必須重做該過程,根據誰擁有程序集的IP,可能會有法律問題,您必須重新簽署程序集,如果需要成爲強名稱的程序集,可能會使用不同的加密證書。
*編輯*
要求包裝代碼示例:
public class ToWrap {
public String Name { get; set; }
public String Address { get; set; }
}
[DataContract]
public class Wrapper {
private ToWrap _wrapped;
// constructor for WCF marshalling
public Wrapper() {
_wrapped = new ToWrap();
}
public Wrapper(ToWrap wrapped) {
_wrapped = wrapped;
}
[DataMember]
public String Name {
get { return _wrapped.Name; }
set { _wrapped.Name = value; }
}
[DataMember]
public String Address {
get { return _wrapped.Address; }
set { _wrapped.Address = value; }
}
}
嗨謝謝你的回覆..我認爲創建一個圍繞這些類的包裝是我的最佳選擇..你可以請舉一個例子來說明如何創建一個小類的兩個屬性的包裝..只有代碼..我稍後會研究t4模板..謝謝 – Prakash 2011-03-17 21:51:23
@Prakash - 你能澄清你想要的代碼嗎?請記住,我建議您編寫將編寫更多代碼的代碼。包裝器代碼將是您的代碼生成器的輸出,並且應該相當簡單。獲取類型信息的反射代碼和所有必要的元數據創建一個生成器來爲給定的一組Type輸入編寫包裝器代碼將更多地涉及。我會安排自己大概3個工作日來撰寫。 – 2011-03-17 21:58:42
我只想一個如何包裝類的小例子..可以說我有一個類有兩個公共屬性..也許公共類客戶{公共字符串名稱;公共字符串地址;}如何包裝將是..? – Prakash 2011-03-17 22:02:36
我從來沒有嘗試,但你可以嘗試添加使用部分類和部分方法的屬性。
-1這絕對不行。部分類由編譯器實現,而不是運行時。它們在編譯時解決。這將涉及修改庫。 – 2011-03-17 19:35:05
如果這些類被標記爲[Serializable接口],那麼你仍然可以使用他們在一個WCF的ServiceContract,但如果他們不是活得那麼有沒有簡單的方法來做到這一點。您別無選擇,只能創建一組具有相同屬性的類,然後每次您要調用某個庫的函數時,將它們逐個屬性複製到該庫的等價物中。
從.Net 3.5 SP1開始,您不再需要指定DataContract。您可以簡單地使用ServiceContract中的類。
有關完整說明,請查看this related question,其中討論何時使用以及何時不使用DataContract及其後果。
它們是否被標記爲[Serializable]? – 2011-03-17 19:33:31