2012-10-08 48 views
1

我们正在对应用程序进行重构,目前的想法是将代码分解为核心库代码+为我们的开发人员定制的代码。自定义代码的自定义文件夹

我正在考虑可能有一个默认为空的文件夹(即'custom'),当开发人员需要从现有的asp页面或新页面定制任何代码时,他们只需要他们到文件夹,它会工作。例如:

可以说核心文件夹存储默认的asp页面。

core\customer\createCustomer.asp <-- the default page 

而当开发商要覆盖页,他需要的是ASP页面复制到自定义文件夹,像

custom\customer\createCustomer.asp <-- modified asp page 

应用程序将自动加载一个自定义的文件夹,而在一个在核心文件夹中。

这是可以在C#中吗?

+0

Prestashop和Magento都共享此功能。我知道这是PHP,但它可能会让你知道它是如何完成的。 –

回答

0

您可以使用VirtualPathProvider加载与“实际请求的文件”不同的文件。这也适用于IIS和缓存。

基本上你继承VirtualPathProvider并覆盖FileExistsGetFileDirectoryExistsGetDirectory方法(有一个在链接页面的例子)。然后,在你AppInitialize,注册

HostingEnvironment.RegisterVirtualPathProvider(sampleProvider); 

顺便说提供商,不要忘了有不同的(不可编辑)页,使用户可以还原为所做的任何更改,以便恢复可以这么说。我可能会有一个简单的版本控制系统,并在用户进行更改时使用提交,并允许用户恢复到以前的更改集。

+0

嗯,我有问题找到我应该在哪里调用AppInitialize方法。我发现这个链接http://stackoverflow.com/questions/329936/when-appinitialize-method-get-invoked-in-asp-net,但不知道它有帮助.. – ipohfly

+0

你链接到的帖子描述的方法。它在应用程序启动时被调用,并且只能在应用程序中定义一次。请阅读[应用程序生命周期](http://msdn.microsoft.com/en-us/library/bb470252(VS.100).aspx),并在您的网站创建时调用RegisterVirtualPathProvider,例如在global.asax文件中的适当事件中。 – Patrick

0

This MSDN article解释了如何使用IHttpModule实现拦截HTTP请求并执行自定义操作(它们指出日志记录,但由于您拦截了请求,因此您可能会获取一些不同的内容,例如您的“自定义”代码)。

+0

这看起来很有希望,但是通过“获取代码”,您的意思是将请求重定向到不同的内容? – ipohfly

+0

我可以想到两种方法:将请求重定向到定制内容,或者不重定向,但是(在幕后)返回定制代码并伪造响应以包含它而不是请求的响应(当然,网站将需要始终引用“核心”内容,而不是意识到它)。 – Alex