在创建插件API时如何避免各地的大工厂功能?

时间:2014-01-29 23:53:21

标签: c# .net

我正在为游戏引擎设计一个插件API。插件需要能够将UI元素添加到引擎中的内容中。要创建一个新容器并在不使用插件API时用简单标签填充它,我只需这样做:

Container container = new Container();
Label label = new Label();
label.Text = "Hello World!";
container.Add(label);

但是,插件无法直接访问Container和Label类(在引擎的GUI组件中定义),而是通过插件API。 (因为如果它们是,对GUI模块的更改可能会破坏所有插件,具体取决于不同版本的GUI模块)

所以相反它会在插件中看起来像这样:

IContainer container = m_Engine.GUI.ElementFactory.CreateContainer();
ILabel label = m_Engine.GUI.ElementFactory.CreateLabel();
label.Text = "Hello World!";
container.Add(label);

不太漂亮。我怎么能调整我的设计,所以我仍然有一个独立于引擎本身的独特插件API,同时仍然允许简短漂亮的代码,而无需在任何地方散布工厂方法调用?

2 个答案:

答案 0 :(得分:0)

您可以创建将作为模板提供的功能。在这些函数中,您可以使用工厂方法调用,并且可以调用这些方法,这样就不会在任何地方复制工厂方法调用。

答案 1 :(得分:0)

首先,你可以使用泛型。

var label = GUI.ElementFactory.Create<ILabel>()

会给你一个标签,你也可以通过像Autofac这样的IoC容器轻松填充。

根据您愿意为插件系统投入多少精力,您可能需要考虑不要让人们在c#中编写插件。他们可以用动态语言(如Powershell,IronPython或IronRuby)编写它们,您可以将这些工厂方法作为环境的主要方面。

或者您可以创建自己的DSL,用于定义您解释的Uis并转换为对象图。

labeledInput playerName "Enter Your Name" (50, 50)
labeledInput likes "What do you like?" (100, 50)