asp.net-mvc-3 – 具有ASP.NET MVC3和嵌入式Razor视图的插件框架
|
我正在使用Razor视图为ASP.NET MVC3设计一个插件框架,并且让嵌入式视图正常工作时出现问题. 插件框架设计具有以下功能: >每个插件都有自己的模型,控制器和视图.视图是嵌入式资源,控件派生自PluginController类 发现插件(使用反射) 现在一切正常,除非嵌入视图引用了插件dll中的类型.然后我得到臭名昭着的错误(遗漏的名字): 命名空间'[MyPluginSolution]’中不存在类型或命名空间名称[插件])(您是否缺少程序集引用?) 这样做的原因是调用运行时编译剃刀视图的csc编译器只能从bin文件夹和GAC获取dll引用. 我也尝试使用this technique预编译视图,但最终给出了相同的结果,因为运行时坚持编译预编译的剃刀视图的包装器. 我当然可以把插件dll放在/ bin文件夹中,但我的问题是: 有没有办法在非bin(和非GAC)文件夹中注册dll,并将其视为“一级公民”,以便它们可以被剃刀视图使用? 解决方法好的,解决方案是使用 this article发现的.首先我用PreApplicationStartMethod创建一个类.此方法扫描插件文件夹,并将dll复制到AppDomain.DynamicDirectory. 然后使用BuildManager.AddReferencedAssembly加载这些dll的每个. 而且,强大的剃刀视图编译精美.请看代码: [assembly: PreApplicationStartMethod(typeof(MySolution.PluginHandler.PluginActivator),"Initialize")]
namespace MySolution.PluginHandler
{
public class PluginActivator
{
private static readonly DirectoryInfo PluginFolderInfo;
static PluginActivator() {
PluginFolderInfo = new DirectoryInfo(HostingEnvironment.MapPath("~/plugins"));
}
public static void Initialize() {
CopyPluginDlls(PluginFolderInfo,AppDomain.CurrentDomain.DynamicDirectory);
LoadPluginAssemblies(AppDomain.CurrentDomain.DynamicDirectory);
}
private static void CopyPluginDlls(DirectoryInfo sourceFolder,string destinationFolder)
{
foreach (var plug in sourceFolder.GetFiles("*.dll",SearchOption.AllDirectories)) {
if (!File.Exists(Path.Combine(destinationFolder,plug.Name))) {
File.Copy(plug.FullName,Path.Combine(destinationFolder,plug.Name),false);
}
}
}
private static void LoadPluginAssemblies(string dynamicDirectory)
{
foreach (var plug in Directory.GetFiles(dynamicDirectory,"*.dll",SearchOption.AllDirectories)) {
Assembly assembly = Assembly.Load(AssemblyName.GetAssemblyName(plug));
BuildManager.AddReferencedAssembly(assembly);
}
}
}
}
我希望这可以帮助其他想要使用这些新技术创建一个干净的插件框架的程序员. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-web-api – 使用OWIN SelfHost和Windows身份验证的
- asp.net-mvc-3 – 我可以在App_Code之外使用全局剃须刀@hel
- asp.net – 无法编写输出文件… pdb visual studio 2010
- asp.net-mvc – 使用AJAX绑定时,在创建/更新后IEnumerable属
- asp.net-mvc-3 – Razor in-line if语句不工作?
- asp.net – Visual Studio可以在新的调试会话中重新启动IIS
- ASP.NET MVC 3数据注释大于下载日期时间和int
- asp.net-mvc – MVC区域 – 非区域路线解析为区域
- ASP.NET Webforms的MVVM模式?
- ASP.NET MVC3角色和权限管理 – 具有运行时权限分配
