如何在运行时引用mvc中的程序集

Ali*_*ran 24 c# asp.net-mvc mef razor

在我的Asp.Net MVC应用程序中,我有一些视图文件(.cshtml),它引用了一个外部库,它将在运行时加载.所以在应用程序启动后,我通过Assembly.Load加载程序集,我通过自己的自定义注册控制器,ControllerFactory每件事都没问题.

但是,在一些引用动态加载程序集的视图中,抛出:

编译器错误消息:CS0234:命名空间"MyApp"中不存在类型或命名空间名称"MyDynamicNamespace"(您是否缺少程序集引用?)

告诉razor编译器无法解析相关程序集的异常.

我的问题是,有没有办法在运行时注册程序集,剃刀编译器能够访问它并解决它?

请注意,我无法使用BuildManager.AddReferencedAssembly方法,因为我的程序集必须在应用程序启动后加载,并且BuildManager不支持它.

Tch*_*uan 9

1)我不建议您的视图直接使用外部引用或动态加载外部引用.通过让您的视图与控制器交互来抽象这一点.使控制器将一个数据对象提供给您的应用程序在构建时已知的视图(换句话说,是构建时Web应用程序已知的对象).这是为了从您的视图中完全隔离(抽象)插件特定的业务.然后让你的控制器与"插件"进行交互.

2)我不知道你的"定制工厂"是如何工作的,但现在我们不再真正建造任何"定制工厂"了.相反,我们利用依赖注入容器,如Microsoft Unity(或Ninject,或Castle Windsor等).创建"定制工厂"是非常老式的,你基本上重新发明了通过依赖注入解决的轮子.

3)至于动态加载外部程序集,我不知道你是否正确,但这里是一个链接:

从外部程序集动态加载类型

4)通常,插件设计会在构建时公开主Web应用程序已知的接口.插件设计隐藏的是可以从一个插件更改为另一个插件的实现.重要的是每个插件都实现了相同的公共接口,即主Web应用程序所需的接口.通常,您将这些接口放在一个单独的"公共"项目中,该项目由您的主Web应用程序和实现这些接口的插件引用.因此,从您的主Web应用程序中,您将了解插件的公共接口是什么,您可以动态加载外部程序集并使用C#反射来查找实现这些接口的类并将它们加载到依赖项注入容器中.同样,任何想要为您的Web应用程序开发插件的人都必须实现"Common"项目中定义的接口.

注意:"Common"只是我给项目的随机名称.您可以将其命名为"PluginInterface"或任何您想要的名称.

在那之后,让你的控制器从依赖注入容器中获取它需要的东西是微不足道的.

注意:您的插件接口可能具有输入和输出实体.这些实体在您的主Web应用程序和插件之间共享.在这种情况下,由于这些实体是接口的一部分,因此它们需要位于"公共"项目中.您可能想让控制器将这些实体直接返回到您的视图,但是您的视图和插件之间不会有完美的抽象.没有完美的抽象是另一个讨论.

希望能帮助到你!

  • OP的问题是关于"插件设计模式",我提供了有关正确方法的信息.它与"ASP.NET动态构建过程"无关.我支持我的回答.OP希望他可以使用`BuildManager`来实现他的插件设计模式,但他发现它与此无关. (2认同)
  • @Tchi首先,非常感谢你的回答.有好事但实际上我惹恼了一个动作的视图应该能够访问动作所具有的任何命名空间,这似乎是一个正常的期望.Hovever我有一个非常复杂的DDD来提供commomn接口,但这不是一个很好的理由在视图中发出任何引用它的插件名称空间或服务,如ViewModels,DataProviders,enums,... :) (2认同)
  • 而且,在我的架构中,我允许插件仅引用核心(DDD)和它自己.不是其他插件或外部库.即使任何插件需要与其他插件进行通信,也可以通过核心以及IoC技术的间接机制来完成. (2认同)

Far*_*rlo 6

作为系统管理员,我会建议一个维护期,特别是如果您替换的文件混淆了其他内容.即使您的维护期仅为半小时,这也是不错的做法.

至于DLL和重新编译...通常,IIS工作进程(运行应用程序池的服务)将根据IIS配置和内存使用情况以正常间隔进行回收.发生这种情况时,如果有任何需要JIT,应用程序将重新编译.它还会终止所有打开的用户会话,因为它会物理停止然后重新启动.对于任何文件更改,工作进程还会监视根目录(如您所述).如果发现任何,则强制重新编译.仅仅因为依赖项被更改不会强制重新编译.如果你预先编译你的DLL,那么编译的唯一内容就是实际ASPX文件中的任何代码,并且它使用每次编译的JIT.根据您的描述,IIS不需要重新编译或重新启动,听起来像是在交换文件时IIS挂起的另一个问题.可能需要让sys管理员参与查看IIS日志.

祝好运!

http://msdn.microsoft.com/en-us/library/ms366723.aspx

http://msdn.microsoft.com/en-us/library/bb398860.aspx