- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在我的 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/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: template pass by value or const reference or…? 以下对于将函数
我用相同的参数列表重载了一个运算符两次。但返回类型不同: T& operator()(par_list){blablabla} const T& operator()(par_list){bla
假设我有实现接口(interface) I 的 Activity A。我的 ViewModel 类 (VM) 持有对实现接口(interface) I 的对象的引用: class A extends
PHP 如何解释 &$this ?为什么允许? 我遇到了以下问题,这看起来像是 PHP 7.1 和 7.2 中的错误。它与 &$this 引用和跨命名空间调用以及 call_user_func_arr
谁能解释一下下面“&”的作用: class TEST { } $abc =& new TEST(); 我知道这是引用。但是有人可以说明我为什么以及什么时候需要这样的东西吗?或者给我指向一个对此有很好解
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三
目录 引言 背景 结论 引言 我选择写C++中的引用是因为我感觉大多数人误解了引用。而我之所以有这个感受是因为我主持过很多C++的面试,并且我很少
Perl 中的引用是指一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至函数,可以应用在程序的任何地方 创建引用 定义变量的时候,在变量名前面加个 \,就得到了这个变量的一个引用 $sc
我编写了一个将从主脚本加载的 Perl 模块。该模块使用在主脚本中定义的子程序(我不是维护者)。 对于主脚本中的一个子例程,需要扩展,但我不想修补主脚本。相反,我想覆盖我的模块中的函数并保存对原始子例
我花了几个小时试图掌握 F# Quotations,但我遇到了一些障碍。我的要求是从可区分的联合类型中取出简单的函数(只是整数、+、-、/、*)并生成一个表达式树,最终将用于生成 C 代码。我知道使用
很多时候,问题(尤其是那些标记为 regex 的问题)询问验证密码的方法。似乎用户通常会寻求密码验证方法,包括确保密码包含特定字符、匹配特定模式和/或遵守最少字符数。这篇文章旨在帮助用户找到合适的密码
我想通过 MIN 函数内的地址(例如,C800)引用包含文本的最后一个单元格。你能帮忙吗? Sub Set_Formula() ' ----------------------------- Dim
使用常规的 for 循环,我可以做类似的事情: for (let i = 0; i < objects.length; i++) { delete objects[i]; } 常规的 for-
在 Cucumber 中,您定义了定义 BDD 语法的步骤;例如,您的测试可能有: When I navigate to step 3 然后你可以定义一个步骤: When /^I navigate t
这是什么UnaryExpression的目的,以及应该怎样使用? 最佳答案 它需要一个 Expression对象并用另一个 Expression 包裹它.例如,如果您有一个用于 lambda 的表达式
给出以下内容 $("#identifier div:first, #idetifier2").fadeOut(300,function() { // I need to reference jus
我不知道我要找的东西的正确术语,但我要找的是一个完整的引用,可以放在双引号之间的语句,比如 *, node()、@* 以及所有列出的 here加上任何其他存在的。 我链接到的答案提供了一些细节,但还
This question's answers are a community effort。编辑现有答案以改善此职位。它当前不接受新的答案或互动。 这是什么? 这是常见问答的集合。这也是一个社区Wi
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
考虑下一个代码: fn get_ref(slice: &'a Vec, f: fn(&'a Vec) -> R) -> R where R: 'a, { f(slice) } fn m
我是一名优秀的程序员,十分优秀!