jjzjj

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

coder 2023-07-11 原文

在我的 Asp.Net MVC 应用程序中,我有一些 View 文件 (.cshtml),它引用了将在运行时加载的外部库。所以在应用程序启动后,我通过 Assembly.Load 加载程序集,并通过我自己的自定义 ControllerFactory 注册 Controller ,一切正常。

但是,在某些引用了动态加载程序集的 View 中,抛出:

Compiler Error Message: CS0234: The type or namespace name 'MyDynamicNamespace' does not exist in the namespace 'MyApp' (are you missing an assembly reference?)

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

我的问题是,有没有办法在运行时注册程序集,使 razor 编译器可以访问它并解析它?

注意我不能使用BuildManager.AddReferencedAssembly 方法,因为我的程序集必须在应用程序启动后加载,而BuildManager不支持。

最佳答案

1) 我不建议让您的 View 直接使用外部引用或动态加载的外部引用。通过让您的 View 与 Controller 交互来抽象它。让您的 Controller 将一个数据对象提供给您的 View ,该数据对象在您的应用程序构建时已知(换句话说,一个在构建时您的 Web 应用程序已知的对象)。这是为了从您的 View 中完全隔离(抽象)插件特定业务。然后让您的 Controller 与“插件”交互。

2) 我不知道你的“定制工厂”是如何工作的,但现在我们真的不再 build 任何“定制工厂”了。相反,我们利用依赖注入(inject)容器,例如 Microsoft Unity(或 Ninject,或 CaSTLe Windsor 等)。创建“自定义工厂”是非常老套的做法,您基本上是在重新发明已通过依赖注入(inject)解决的轮子。

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

Dynamically load a type from an external assembly

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

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

在那之后,让你的 Controller 从依赖注入(inject)容器中获取它需要的任何东西是微不足道的。

注意:您的插件接口(interface)可能会有输入和输出实体。这些实体在您的主要 Web 应用程序和您的插件之间共享。在这种情况下,由于这些实体是您的界面的一部分,因此它们需要位于“通用”项目中。您可能想让您的 Controller 将这些实体直接返回到您的 View ,但是这样您就不会在 View 和插件之间有一个完美的抽象。没有完美的抽象是另一个讨论。

希望对您有所帮助!

关于c# - 如何在运行时引用mvc中的程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31096919/

有关c# - 如何在运行时引用mvc中的程序集的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  4. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  5. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  6. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  7. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  8. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  9. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  10. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

随机推荐