【发布时间】:2013-02-15 01:54:45
【问题描述】:
我们正在为少数客户构建应用程序,每个客户都有自己的要求以及类似的要求。我们还希望将所有代码保留在同一个应用程序中,而不是对其进行分支,并且 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();
}
【问题讨论】:
-
MEF 在这里似乎是一个不错的选择。 msdn.microsoft.com/en-us/library/dd460648.aspx
-
-
你考虑过使用依赖注入吗?您可以在应用程序启动时根据给定客户配置依赖关系。
-
@jrummell 但是哪个 DI 提供商;和/或,有一个例子? DI 和动态加载是两个不同的东西——这个问题的核心可以用工厂 + 动态加载来回答。那么,回到开头:如何从附属程序集中动态加载类型?
-
关于如何加载程序集/类型和创建实例:stackoverflow.com/questions/1803540/… 和 stackoverflow.com/questions/1137781/… - 我已经提到这是“最低要求”,尽管 DI 和组合框架可以 帮助整体设计。至少我肯定会推荐 DI,但请参阅这些问题以获得直接答案。
标签: c# .net dynamic-loading