我已经根据本网站上的建议为ASP MVC应用程序编写了一个插件解决方案,但是,我已经遇到了障碍,并希望得到一些帮助。在不深入了解插件系统如何工作的情况下,它确实成功加载了控制器并找到了合适的视图 - 问题是视图无法编译,因为它无法解析所有插件的引用(插件DLL引用了其他主机应用程序不知道的DLL。)
我在CurrentDomain上使用AssemblyResolve,但是当默认的BuildManager正在编译视图时,它不会被调用,而是从web.config部分获取程序集列表。如果我将所有插件文件添加到GAC并在该部分添加引用 - 它工作正常。但是,如果我必须为每个插件更改web.config,那就无法实现插件系统的目的。
解释这个问题的一个小插图: Plugin.dll --references - > PluginServices.dll
网址http://mysite.com/some/index MVC Application --load - > Plugin.dll PASS
MVC Application --load - > Plugin.SomeController PASS
MVC应用程序--find - > Plugin \ Views \ Some \ Index.aspx PASS
MVC应用程序 - 编译 - > Index.aspx FAIL(该视图使用了一个无法找到的PluginServices类型)
有没有办法动态添加对BuildManager的引用,以便编译通过而不更改web.config?
提前致谢!
答案 0 :(得分:0)
您需要考虑创建一些可以放在基本应用程序中的接口或抽象类(最好是接口),这样当插件不存在时,基本应用程序仍然会编译。然后,在插件中编写接口或基类的实现。
This article会让你入门。
答案 1 :(得分:0)
我认为您不希望您的主机项目编译插件dll。我想你想提前构建插件并且可能在汇编dll中嵌入视图 - 这样,你可以创建适当的接口[Robert Harvey et-al]并让主机app依赖于动态加载的事实汇编是好的。也许您还需要创建一个插件线束解决方案,您可以在其中(单元?)测试插件的开发/编译 - 这似乎是必要的,因为视图中的某些编译错误不会立即显示(this post也应该有助于编译器观点中的错误 - 它对我有用。)
答案 2 :(得分:0)
吉尔,
查看以下文章。它解释了如何使用Reflection在运行时获取有关业务层程序集的信息,然后使用InvokeMember调用所需的方法。它不需要任何类型的注册工作;你只需要一条装配路径。
C#反射和动态方法调用
http://my.execpc.com/~gopalan/dotnet/reflection.html
答案 3 :(得分:0)
同样,直接加载逻辑的部分工作正常并且还定位视图,唯一不起作用的部分是我无法控制的部分 - 这是页面的实际呈现。
但是,我确实设法让它发挥作用。我必须做的是以下内容: 1)让插件DLL在GAC中注册2)在'compilation'部分下的主机的web.config中添加对DLL的引用
3)确保插件中的所有视图都不使用'inherit'属性来强类型化视图,而是创建一个局部变量并将模型强制转换为适当的类型。
这一切似乎现在都可行,但我会继续考虑,看看能不能提出更好的解决方案。
同样,我不确定任何人都可以声称他们有一个MVC的插件系统并且没有处理一个简单的view.aspx,它有一行如下:<%= Model.Name%>其中Model是主机确实知道的对象。
再次感谢您的所有答案!