我正在开发一个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 :添加了更多代码示例
答案 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();
答案 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);
这会让你的生活变得更加复杂。
希望这有帮助