Html ashx比较mvc,介绍ASP.NET MVC5可能你不知道但很有用三个特性

今天介绍ASP.NET mvc5可能你不知道但很有用三个特性,分别是PreApplicationStartMethodAttribute、BuildProvider.RegisterBuildProvider和BuildManager.AddReferencedAssembly。

一、PreApplicationStartMethodAttribute

PreApplicationStartMethodAttribute是一个特性类,它可以定义代码是ASP.NET所有管道模块运行之前运行,甚至是在Application_Start事件之前。使用方法也很简单,创建一个类库项目,然后用这个特性在这个项目的程序集级别中声明(比如:AssemblyInfo.cs),有如下代码:

[assembly: PreApplicationStartMethod(typeof(SomeClassLib.Initializer), "Initialize")]

你可以从上面看到PreApplicationStartMethodAttribute这个特性需要两个参数,第一个是类的名称包括其命名空间,第二参数为类的方法。

注意这个方法需要是public static void,而且不能有参数。

public static class Initializer

{

public static void Initialize()

{

// Whatever can we do here?

}

}

在Initialize方法中你可以添加自己的一些代码,做一些初始化的相关工作。

这个特性的主要使用场景是可以为我们完成一些初始化的工作,而Application_Start事件函数不能完成我们要求,因为它太晚了。需要在Application_Start调用之前,就要做一些工作。比如:注册一些build providers或者动态为程序添加一些引用。在开源的电子商务系统nop中就使用这个特性。

[assembly: PreApplicationStartMethod(typeof(PluginManager), "Initialize")]

namespace Nop.Core.Plugins

{

///

/// Sets the application up for the plugin referencing

///

public class PluginManager

{

//省略其它代码

}

public static void Initialize()

{

//省略其它代码

}

}

二、BuildProvider.RegisterBuildProvider

我们在使用VS开发项目的时候生成,或者发布的时候都会用到一个叫做BuildProvider的东西。在服务器的web的根目录中的Web.config可以看到一些内置的的BuildProvider。如下:

文件的扩展名对应的BuildProvider。微软官方对BuildProvider解释是这样的:

ASP.NET 生成环境使用 BuildProvider 对象为应用程序内的不同文件类型生成源代码。 从 BuildProvider 派生的类主要提供文件、网页、资源和其他自定义项的源代码。

ASP.NET 生成环境使用 BuildProvider 类的实例在应用程序内生成文件。 BuildProvider 类的 VirtualPath 属性指示要生成的文件的路径。 应用程序内每个文件的文件扩展名均被映射到对应的生成提供程序中。 ASP.NET 生成环境基于文件扩展名初始化每个文件的 BuildProvider 实例,并使用 BuildProvider 方法生成文件的源代码。 在从一个或多个文件生成程序集时,ASP.NET 生成环境基于文件的首选编译器语言和上下文将 AssemblyBuilder 对象传递给 BuildProvider 方法,以便 BuildProvider 实例可以将其文件的源代码提供给总体程序集。

若要为 ASP.NET 应用程序内的文件类型定义自定义生成操作,就必须从 BuildProvider派生一个类,实现派生类中的成员以便生成文件类型,并为应用程序配置文件中对应的文件扩展名配置生成提供程序。

因此如果我们想自己写一个BuildProvider针对一个特定的类型的文件,要应用到我们的程序中可以有两种方式。

一、在Web.Config中buildproviders结点下add一个我们的buildprovider。示例:

extension=".mafx"

type="MyBuildProviderType, MyBuildProviderAssembly" />

二、可以使用上面介绍的在PreApplicationStartMethodAttribute定义的方法里面使用编程的方式动态的注册buildprovider。如下代码:

BuildProvider.RegisterBuildProvider(".foo",typeof(MyBuildProvider));

三、BuildManager.AddReferencedAssembly

在第一个特性中我们介绍了PreApplicationStartMethodAttribute定义的方法可以在Application_Start之前和运行ASP.NET任何管道之前调用,利用这个特性我们就可以为我们的程序在运行的时候动态的添加一些程序集的引用。因为有时候我们不能通过编译的时候就知道全部要引用的程序集,比如插件就是一个很好的特例,插件最突出的特点就是可以热插拔,这样我们程序就是在启动之前查找程序的插件目录有哪些插件,然后依次把这些程序集引用进来。Nop的插件机制也是这样实现的,其中Nop中插件机制最核心的类Nop.Core.Plugins.PluginManager有一个方法PerformFileDeploy就是用到了BuildManager.AddReferencedAssembly来动态引用程序集。

private static Assembly PerformFileDeploy(FileInfo plug)

{

if (plug.Directory.Parent == null)

throw new InvalidOperationException("The plugin directory for the " + plug.Name +

" file exists in a folder outside of the allowed NopCommerce folder heirarchy");

FileInfo shadowCopiedPlug;

if (CommonHelper.GetTrustLevel() != AspNetHostingPermissionLevel.Unrestricted)

{

//all plugins will need to be copied to ~/Plugins/bin/

//this is aboslutely required because all of this relies on probingPaths being set statically in the web.config

//were running in med trust, so copy to custom bin folder

var shadowCopyPlugFolder = Directory.CreateDirectory(_shadowCopyFolder.FullName);

shadowCopiedPlug = InitializeMediumTrust(plug, shadowCopyPlugFolder);

}

else

{

var directory = AppDomain.CurrentDomain.DynamicDirectory;

Debug.WriteLine(plug.FullName + " to " + directory);

//were running in full trust so copy to standard dynamicfolder

shadowCopiedPlug = InitializeFullTrust(plug, new DirectoryInfo(directory));

}

//we can now register the plugin definition

var shadowCopiedAssembly = Assembly.Load(AssemblyName.GetAssemblyName(shadowCopiedPlug.FullName));

//add the reference to the build manager

Debug.WriteLine("Adding to BuildManager: '{0}'", shadowCopiedAssembly.FullName);

BuildManager.AddReferencedAssembly(shadowCopiedAssembly);

return shadowCopiedAssembly;

}

上面倒数第二行就是动态引用程序集。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值