gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:25:03 25 4
gpt4 key购买 nike

在我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com