使用API​​包裹界面的目的

时间:2009-09-16 20:29:19

标签: c# .net

我正在开发一个C#Web应用程序,它有一个页面(MainPage),有一个小区域来显示小工具。实现主界面(IMainInterface)和可选界面(IOptionalInterface)的小工具有几种。

在MainPage中,当与gadget类交互时,它使用以下语法:

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课真的是必要的吗?如果MainPage直接访问接口(IMainInterface和IOptionalInterface),它不会减少开销吗?

更新:看到一些答案,我意识到我并不清楚“几种小工具”意味着不同的类(例如CalendarGadget,TaskGadget)。

更新2 :添加了更多代码示例

4 个答案:

答案 0 :(得分:2)

MyApi类看起来像是在屏蔽你使用反射来创建对象,null检查是否使用了可选接口,并且可能是一般使用接口的全部事实。没有所有的代码,这是猜想。正如Dzmitry Huba指出的那样,混合工厂和包装纸是一种难闻的气味,你应该尝试重构它。

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

工厂解耦创造的逻辑,但它应该只负责创造。

问:myAPI中是否存在任何逻辑,或者只是在小工具支持该界面时才创建然后调度?

如果MyApi没有任何逻辑,很难理解为什么它是必要的。也许MyApi的作者当时没有意识到你可以在需要时转换到其他界面。我有一种预感,他们试图保护初级开发人员免受接口的攻击。<​​/ p>

// basic use of interfaces
IMainInterface gadget = GadgetFactory.GetGadget("Gadgets.Calendar");
gadget.SomeMethod();

IOptionalInterface optional = gadget as IOptionalInterface;
if( optional != null ) // if optional is null, the interface is not supported
    optional.SomeOptionalMethod();

相关的SO问题Difference between Activator.CreateInstance() and typeof(T).InvokeMember() with BindingFlags.CreateInstance

答案 1 :(得分:1)

是的,根据你问题中的描述,我会说反射或任何其他间接机制是不必要的。我不确定这是否能回答你的问题?

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

答案 2 :(得分:1)

似乎是MyApi混合工厂和消费者的作者。在编译时定义接口成员时,我没有看到任何理由间接访问接口成员。

答案 3 :(得分:0)

一般来说这不错。但我想这对你的意图来说是完全矫枉过正的。我建议借用国际奥委会的东西。

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

这会让你的生活变得更加复杂。

希望这有帮助