2009-06-02 49 views
1

我已经编写了一个ASP MVC应用程序的插件解决方案基于本网站上的建议,但是,我已经到了一个障碍,并希望得到一些帮助。不用太深入了解插件系统的工作原理,它会成功加载控制器并找到适当的视图 - 问题在于视图无法编译,因为它无法解析所有插件的引用(插件DLL引用了其他主机应用程序不知道的DLL)。添加引用到ASP MVC页面编译引擎

我在CurrentDomain上使用AssemblyResolve,但在默认BuildManager编译视图时未调用,而是从web.config部分获取程序集列表。如果我将所有插件文件添加到GAC并在该部分中添加引用 - 它工作正常。但是,如果我必须为每个插件更改web.config,那么这会破坏拥有插件系统的目的。

小插图来解释这个问题: Plugin.dll --references - > PluginServices.dll

URL http://mysite.com/some/index MVC应用--load - > Plugin.dll PASS

MVC应用程序--load - > Plugin.SomeController PASS

MVC应用--find - >插件\视图\一些\的Index.aspx PASS

MVC应用--compile - >的Index.aspx FAIL(第e查看使用来自PluginServices的一种无法找到的类型)

有没有一种方法可以动态地添加对BuildManager的引用,以便编译通过而不会改变web.config?

在此先感谢!

回答

0

同样,直接加载逻辑的部分工作正常,也定位的看法,只是不工作的部分是一部分,我没有控制 - 这是页面的实际渲染。

但是,我确实做到了。我不得不做的是以下几点: 1)有插件的DLL在GAC

2)下的“编辑”添加到DLL的宿主的web.config文件的引用注册部分

3)确保插件中的所有视图不使用'inherit'属性来强制输入视图,而是创建一个局部变量并将模型转换为适当的类型。

这一切似乎现在工作良好,但我会继续思考它,看看我是否能想出一个更好的解决方案。

再次,我不确定任何人都可以声称他们有一个MVC插件系统,并没有处理一个简单的view.aspx,其中有一行:<%= Model.Name%>其中Model是一个对象主持人确实知道。

再次感谢您的答案!

0

您需要考虑创建一些接口或抽象类(最好是接口),以便当插件不存在时基础应用程序仍然可以编译。然后,您可以在插件中编写接口或基类的实现。

This article会让你开始。

+0

感谢您的回复,但这并没有真正的工作,因为问题是当ASP试图实际呈现页面并解析引用时,它无法找到关联的DLL。 – Gil 2009-06-04 00:09:57

+0

如果您没有可用插件接口的实现(即使它只是一个存根或单元测试模拟),您如何期望应用程序运行? – 2009-06-04 01:23:53

+0

该实现是在运行时交付给插件的另一个程序集。插件只知道它使用的对象的接口,以及服务层在运行时使用真实对象的子接口。问题是当主机应用程序在插件中呈现视图时,它无法解析接口名称。 – Gil 2009-06-04 02:18:57

0

我想你不想让你的主机项目编译插件DLL。我想你希望事先构建插件,并且可能将视图嵌入到程序集dll中 - 这样,您可以创建适当的接口[Robert Harvey et-al],并让主机应用程序依靠动态加载大会是好的。也许你还需要创建一个插件线束解决方案,其中你(单元?)测试插件的开发/编译 - 这似乎是必要的,因为视图中的一些编译错误不会立即显示(this post也应该帮助编译器在视图中的错误 - 它为我工作)。

0

Gil,

看看下面的文章。它解释了如何使用Reflection在运行时获取有关业务层汇编的信息,然后使用InvokeMember调用所需的方法。它不需要任何种类的注册工作;你只需要一个路径到你的程序集。

C#反思与动态方法调用
http://my.execpc.com/~gopalan/dotnet/reflection.html