2009-09-16 31 views
1

我正在研究一個C#web應用程序,該應用程序具有一個帶小區域的頁面(MainPage)以顯示小工具。有幾種小工具實現主界面(IMainInterface)和可選界面(IOptionalInterface)。使用API​​封裝界面的目的

在的MainPage,與小工具類交互時,它使用的語法如下:

MyAPI api = new MyAPI(); 
api.SomeMethod(gadgetClassName, param); 

而且在api.SomeMethod(...),但它下面:

// use reflection to get an IMainInterface based on gadgetClassName 
Type t = Type.GetType(gadgetClassName); 

IMainInterface gadget = (IMainInterface)t.InvokeMember(
    gadgetClassName, 
    BindingFlags.CreateInstance, 
    null, 
    null, 
    null); 
return gadget.SomeMethod(param) 

看着這個MyAPI類包含了一大堆映射到IMainInterface和IOptionalInterface中定義的相應方法的方法。

我的問題,這是MyAPI類真的neccesary?如果MainPage直接訪問接口(IMainInterface和IOptionalInterface),會不會降低開銷?

更新:看到一些答案,我意識到我並不清楚「幾種小工具」是指不同的類(例如CalendarGadget,TaskGadget)。

更新2:增加更多的代碼示例

+1

我不認爲有一個在你的問題,給你充足的回答中提供足夠的代碼。 api.SomeMethod()中的其他一些代碼是什麼?它如何使用反射? – 2009-09-16 23:59:49

+0

修改了這個問題,以包括更多的信息在api.SomeMethod() – 2009-09-17 17:23:34

回答

2

的MyApi類看起來像它的屏蔽您使用反射來創建對象,null檢查如果可選的接口沒有使用,並可能在一般的使用接口的整個事實。沒有所有的代碼,這是猜測。正如Dzmitry Huba所指出的那樣,混合一個工廠和一個包裝是一種難聞的氣味,你應該嘗試重構它。

static class GadgetFactory 
{ 
    public static IMainInterface GetGadget(string className) 
    { 
     (IMainInterface)Activator.CreateInstance(Type.GetType(className)) 
    } 
} 

一個工廠創造解耦的邏輯,但它應該只負責創作。

問:在myAPI中是否有任何邏輯?或者它只是在創建並調度小工具是否支持該接口?

如果MyApi沒有任何邏輯,很難明白爲什麼它是必要的。也許MyApi的作者當時並沒有意識到你可以在需要時投射到其他界面。我有一個預感,他們試圖屏蔽接口的初級開發人員。

​​

一個相關的SO問題Difference between Activator.CreateInstance() and typeof(T).InvokeMember() with BindingFlags.CreateInstance

+0

這很好解釋先生!現在想想看,作者可能是爲了防止初級開發人員從底層實現(這可能更多是一個主觀問題)和工廠。我將把它放在我將要重構的列表上。 非常感謝! – 2009-09-18 16:56:54

1

是的,從你的問題的描述,我想說的反射或任何其他間接機制是不必要的。我不確定這是否會回答你的問題?

// in MainPage: 
IList<IMainInterface> gadgets = new List<IMainInterface> 
{ 
(IMainInterface)Activator.CreateInstance(Type.GetType("Gadgets.CalendarGadget")), 
(IMainInterface)Activator.CreateInstance(Type.GetType("Gadgets.TaskGadget")), 
}; 
+0

感謝您的答覆,請參閱我的更新了一些澄清。 – 2009-09-16 21:49:18

+0

我仍然沒有得到你真正想問的,但我已經更新了我的答案,有多個小工具... – dtb 2009-09-16 21:57:00

+0

嗯,有趣的解決方案,但如何確定小工具時,如何調用gadget.SomeMethod()在運行時? – 2009-09-16 22:25:47

1

這似乎是MyApi混合工廠和消費者的作者。我沒有看到有任何理由在編譯時定義它的時候間接訪問接口成員。

0

通常這並不壞。但我想這對你的意圖完全是過度的。我會建議從國際奧委會借用一些東西。

var api = new MyAPI(new GadgetClass()); 
api.SomeMethod(parameters); 

這會讓你的生活複雜得多。

希望這有助於

+0

感謝您的回覆,請參閱我的更新瞭解一些說明。 – 2009-09-16 21:46:06

+0

我不認爲這個問題中有足夠的信息來得出這個結論。如果MainPage無法實例化類,您如何回答幫助?如果是實例化類的myAPI,那麼實際上,這已經是IOC的變體。 – 2009-09-17 00:22:50

+0

完全純粹的方式將是在代碼中沒有新的。所有這些都將使用IOC容器完成。所以這裏的代碼只是一個小樣本。 – Dejan 2009-09-17 07:15:05