我们正在为少数客户构建应用程序,每个客户都有自己的要求以及类似的要求。我们还希望将所有代码保留在同一个应用程序中,而不是对其进行分支,并且 IF 不是一个好的选择,因为它会遍布各处。
我计划为所有人开设基础课程。然后每个客户都会有自己的类,其中重写方法将执行特殊的逻辑。
我们如何在编译时加载程序集而不是这样做
public class BaseClass {
public string getEventId()
}
public class ClassForJohn:BaseClass {
[override]
public string getEventId()
}
public class ClassForAdam:BaseClass {
[override]
public string getEventId()
}
void UglyBranchingLogicSomewhere() {
BaseClass eventOject;
if("John"==ConfigurationManager.AppSettings["CustomerName"]){
eventOject = new ClassForJohn();
}else if("Adam"==ConfigurationManager.AppSettings["CustomerName"]){
eventOject = new ClassForAdam();
}else{
eventOject = new BaseClass ();
}
eventId = eventOject.getEventId();
}
这是我将插件(加载项)加载到我的项目之一中的方式:
const string PluginTypeName = "MyCompany.MyProject.Contracts.IMyPlugin";
/// <summary>Loads all plugins from a DLL file.</summary>
/// <param name="fileName">The filename of a DLL, e.g. "C:\Prog\MyApp\MyPlugIn.dll"</param>
/// <returns>A list of plugin objects.</returns>
/// <remarks>One DLL can contain several types which implement `IMyPlugin`.</remarks>
public List<IMyPlugin> LoadPluginsFromFile(string fileName)
{
Assembly asm;
IMyPlugin plugin;
List<IMyPlugin> plugins;
Type tInterface;
plugins = new List<IMyPlugin>();
asm = Assembly.LoadFrom(fileName);
foreach (Type t in asm.GetExportedTypes()) {
tInterface = t.GetInterface(PluginTypeName);
if (tInterface != null && (t.Attributes & TypeAttributes.Abstract) !=
TypeAttributes.Abstract) {
plugin = (IMyPlugin)Activator.CreateInstance(t);
plugins.Add(plugin);
}
}
return plugins;
}
我假设每个插件都实现IMyPlugin
。您可以按照您想要的任何方式定义此接口。如果循环遍历插件文件夹中包含的所有 DLL 并调用此方法,则可以自动加载所有可用的插件。
通常,您至少有三个程序集:一个包含接口定义、引用此接口程序集的主程序集以及至少一个实现(当然还引用)此接口的程序集。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)