2009-09-16 33 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