2011-11-23 44 views
2

我正在尝试构建一个使用插件的核心应用程序,以便核心永不改变,每次我们获得新客户端时,我们都会为它们编写一个模块。我们使用新的客户类实现了一个名为IClientPlugin的接口。如何让一个核心类调用一个客户类?

这是使用Compact Framework 3.5和Windows Mobile 6.5.3。

所以这是我需要acheive:

这是一个仓库管理系统。第一项任务是从卡车的产品中接收手持设备扫描条码的条形码。

当用户点击接收菜单项时,核心模块就会启动。

的核心方法是 - callClientMethod()

我知道客户的名字,它是在登录存储在一个全局变量和类将是{clientname}.cs 并包含一个名为processReceiving()方法。

我知道如何实例化这个对象。

问题是:有没有一种方法可以动态创建客户端类的实例,而无需硬编码case语句?

例如,假设我有2个客户端Acme和Widgets。他们每个人都得到一个客户端类,即Acme.csWidgets.cs

如果我登录为阿克米或小工具我想要的代码,以动态创建客户端类的实例,我的身份登录,使核心代码没有改变因为只要为他们添加模块,我就可以添加更多的客户端。

伪例如:

var myClient = New (Clientname)(); 

这是可能的,或者有更好的设计方法,或者说是开关/ case语句neccessary邪?

+0

角括号会被系统所占用,所以我将它改为'{clientname} .cs'。不是一个C#程序员我不知道如果这是可以接受的指示样板。 – Verbeia

+0

我想人们仍然会感谢佛贝拉。 –

+0

客户类是否驻留在同一个程序集中? – misha

回答

1

您可以使用反射来动态创建对象。 加载类型或程序集有很多种方法。让我们从一个简单的一个:

Type clientType = Type.GetType("AssemblyName, TypeName"); 
IClientPlugin clientPlugin = 
        (IClientPlugin)Activator.CreateInstance(clientType);  

如果您的客户端被命名为myClient1和你有约定,你的组件被命名为例如像Clients.ClientName.dll那么你可以写一个函数:

IClientPlugin CreatePluginInstance(string clientName) { 
    string typeName = string.Format("Clients.{0}, {0}", clientName); 
    Type clientType = Type.GetType(typeName); 
    IClientPlugin clientPluginInstance = 
         (IClientPlugin)Activator.CreateInstance(clientType);  
    return clientPluginInstance; 
} 

编辑

如果你的插件类都位于相同的组件,你的马在项目中,可以简化Type.GetType的号召,只指定类名:

Type.GetType(clientName); 
+0

谢谢,但有没有办法在dll的项目之外引用它们。我试图避免建设完整的工厂,因为有些年轻的开发人员将不得不保持这种尚未完全掌握先进.NET原则的开发人员。 –

+0

我不知道你在* dll的*以外是什么意思。你能详细说明一下吗? – Jan

+0

是我引用的类不在dll中它在我正在工作的项目的子目录中 –

0
var myClient = Activator.CreateComInstanceFrom("Acme.dll","Acme"); 

在这里您可以参数化大会名称和类型名称。

+0

谢谢你,但有没有办法在dll之外的项目中引用它们。我试图避免建设完整的工厂,因为有一些年轻的开发人员必须保持这一点,但尚未完全掌握先进的.net原则 –