Asp.net 非引用程序集的Invoke方法

Asp.net 非引用程序集的Invoke方法,asp.net,asp.net-mvc-4,events,delegates,assemblies,Asp.net,Asp.net Mvc 4,Events,Delegates,Assemblies,我正在尝试建立一个模块化的MVC4项目 现在,webapplication引用了一个“核心”程序集。我的模块在核心。模块具有所需的控制器和视图。因此,我的视图和控制器在一个单独的项目中。使用自定义viewengine进行渲染。到目前为止还不错 但是,我想从核心组件本身分离模块。因此,能够“注入”来自不同项目的模块 现在,“核心”还负责为webapp创建所有导航属性,封装在如下导航类中: public static List<IModuleNavigationGroup> CRM()

我正在尝试建立一个模块化的MVC4项目

现在,webapplication引用了一个“核心”程序集。我的模块在核心。模块具有所需的控制器和视图。因此,我的视图和控制器在一个单独的项目中。使用自定义viewengine进行渲染。到目前为止还不错

但是,我想从核心组件本身分离模块。因此,能够“注入”来自不同项目的模块

现在,“核心”还负责为webapp创建所有导航属性,封装在如下导航类中:

public static List<IModuleNavigationGroup> CRM() {
  var NavigationGroups = new List<IModuleNavigationGroup>();
  NavigationGroups.Add(Modules.ServiceDesk.Navigation.MenuItems());
  NavigationGroups.Add(Modules.Relation.Navigation.MenuItems());
  NavigationGroups.Add(Modules.Invoices.Navigation.MenuItems());
  NavigationGroups.Add(Modules.Projects.Navigation.MenuItems());
  return NavigationGroups;
}
公共静态列表CRM(){
var NavigationGroups=新列表();
添加(Modules.ServiceDesk.Navigation.MenuItems());
添加(Modules.Relation.Navigation.MenuItems());
添加(Modules.Invoices.Navigation.MenuItems());
添加(Modules.Projects.Navigation.MenuItems());
返回导航组;
}
这是可行的,但我不想用这种“CRM”方法从核心中创建导航菜单。相反,我需要/想要创建一个新项目,引用核心并订阅一个初始化方法(或其他)。调用此方法时,我希望将模块中的导航添加到核心导航

我的想法如下

始终需要以下两点:

项目1-核心

项目2-演示文稿(UI)

“可选”项目,或包含模块的项目

项目3-模块

现在,当(2)启动时,它将从(1)初始化导航。发生这种情况时,(1)必须知道从(3)返回哪些项目。我不想要从(1)到(2或3)的引用,因为在不同的项目中,模块可能不同

我考虑的是(1)中的委托,但(3)从未实例化


提前谢谢,我希望我的问题很清楚。

您可以使用DI或IOC框架。基本步骤:1)定义接口,以便了解如何与这些模块通信。2) 使用Assembly.Load在运行时加载模块。3) 在工厂注册实现接口的对象。4) 在你的工厂请求模块,你就完成了。第2步是我在核心项目中不能做的,因为我不知道将使用哪个组件。导航组都实现了INavigationGroup接口。是否有一种方法可以查找实现此接口的所有类而不知道运行时的程序集?
是否有一种方法可以查找实现此接口的所有类而不知道运行时的程序集?
而不知道程序集@runtime?那很难。如果我用你的接口创建一个程序集,你永远也说不出来。不知道程序集@buildtime不是问题。您可以在运行时加载程序集(可能是从插件文件夹),并检查类是否实现了您的
INavigationGroup
接口;对于
导航组.Add(Modules.Relation.Navigation.MenuItems())
,您需要一种不同的方法。如果你想要一个动态的设置,你只允许与接口交谈,而不是与混凝土交谈。