多个ASP.NET Web应用程序,取决于常见的基本应用程序

我有不同客户的多个SQL Server数据库(相同的架构)。 他们将共享一个通用的ASP.NET Web应用程序。 如果其中一个客户想要一个自定义版本的网页,我们将在他的目录(或项目)中创建一个新的。

例:

/Main Application/WebPage.aspx /Main Application/WebPage2.aspx /Main Application/Customer 1/WebPage.aspx /Main Application/Customer 2/WebPage.aspx 

目前,我有以下项目结构

 Solution (Main application) ASP.NET Main Project Other projects (BLL, DAL, etc.) Solution (Customer 1) ASP.NET Project Other projects (BLL, DAL, etc.) Same thing for Customer 2 

在每个客户解决方案中,我添加了对主应用程序项目的引用,以解决依赖关系,并使用未自定义的网页。

每个ASP.NET项目代表一个不同的IIS虚拟目录,因此我们在此示例中有3个。 (/ Main,/ Main / Customer1,/ Main / Customer2)。

我现在遇到的问题是当我尝试连接到正确的数据库时。 每个解决方案内的每个ASP.NET项目都有一个带有客户数据库连接字符串的web.config文件。 当我从基础ASP.NET项目(主应用程序)运行程序(比如说WebPage2.aspx)时,我无法获取此连接字符串,因此我不知道要连接到哪个数据库。

我试图将所有连接字符串放在主应用程序web.config中,但是在项目启动时我找不到引用正确的方法。 似乎没有办法设置自定义属性,我可以在解决方案级别指定当前解决方案的连接字符串名称(或键)。

对此有何想法或顽固? 我不介意改变我的项目结构,但重要的是每个客户都有自己的解决方案,这样我们就可以保持清洁和分离。

如果我是你,我会考虑从你的主应用程序库创建一个NuGet包。 (NuGet包可以完全保密,因此您不必担心开源要求……)

使用NuGet软件包,只需将软件包安装到客户的解决方案中,即可复制dll程序集,aspx文件,xml配置以及客户需要的任何其他内容。 您可以在IIS中为每个客户创建一个单独的虚拟目录(甚至网站),他们将拥有运行所需的一切。

最重要的是,通过这种方式获得另一个非常重要的事情:可维护性。 您可以继续在主解决方案中处理新function和错误修复,并且只要您想将某些内容推送到客户站点,您就可以发布NuGet包的更新。 然后,您可以将该软件包更新安装到您的一个或所有客户特定站点中,但您不必同时执行此操作。 如果某个客户站点由于某种原因需要落后,则不会阻止其他客户访问新function。

创建一个NuGet包非常简单 ,与单独解决方案中的多个站点依赖于另一个解决方案的构建的解决方案相比,它将使您具有可维护性,在这个解决方案中,您甚至无法同时检查所有代码以查找编译错误…

您可以采取的一条路径是将所有站点部署到同一目录中。

你可以这样做:

– 这些是类库项目
Library.Core < - 所有模块共有的类
Customer.Cust1 < - 仅针对客户#1的类
Customer.Cust2 < - 仅针对客户#2的类

网站 – 所有网站
Site.Core < - 主站点,有你的web.config和常用页面
Site.Cust1 < - 包含特定于此客户的项目。 引用Customer.Cust1和Library.Core Site.Cust2 < - 特定于客户2.引用Customer.Cust2和Library.Core

客户网站的结构应如下:

 $Project Name / Styles cust1.css / Scripts cust1.js /Customer 1 / Cust1page.aspx (whatever you want to call it) / Cust2page.aspx 

主站点的结构应如下:

 $Project Name / Styles main.css / Scripts main.js / whatever common directory whateverpage.aspx / master masterpage.master 

您可以复制masterpage.master并将其放入每个客户站点。 只需将其设置为不复制,内容类型为none。

部署时,首先执行主站点。 之后部署客户站点。 不要让部署首先删除文件。

.Net将愉快地结合一切。 只要你没有任何名字冲突,你就会好起来。

这样,您就可以将单个客户或所有客户部署到同一台计算机上。

接下来,不要在web.config中存储客户特定的连接字符串。 相反,只需存储连接字符串即可解析公共数据库中的登录。 当一个人登录时,让DB为您提供用于该站点其余部分的连接字符串。

或者,您可以将数据库合并为一个,并使用模式以客户为基础分隔表名。 例如cust1.Accounting或其他。

听起来像你应该为每个客户端提供完全独立的解决方案,包括运行所需的所有代码,而不是依赖于基本Web应用程序。 您可以拥有一个包含所有基本function(基页,数据访问规则等)的DLL,这些function在您的所有解决方案(可能是单个副本,可能在GAC中)之间共享,但我可能不会使用基础Web应用程序 – 我不知道是否可能。

似乎没有办法设置自定义属性,我可以在解决方案级别指定当前解决方案的连接字符串名称(或键)。

您无法通过解决方案执行此操作,您需要使用程序集。

我的建议是定义一个漂亮的小接口(比如“ IClientIDKey ”),它最终由建立客户端特定数据访问的中央共享逻辑/工厂使用。

为每个客户端生成一个实现IClientIDKey的唯一ClientIDKey项目

我现在遇到的问题是当我尝试连接到正确的数据库时

所以这将由IClientIDKey解决。 您需要让应用程序启动,并将某种变量传递到建立正确数据库连接的工厂。 我认为这个变量可能是一个URL或一个登录,但在重新阅读你的问题并思考它之后,我认为IClientIDKey会为你做这一切。 在这个初始阶段,你将会遇到一个共享的中央数据库。 一旦识别出正确的数据库,您就可以知道在何处路由所有客户端特定的请求。

这导致了下一部分:

接口。 部署时,只需部署客户端密钥DLL,该DLL在运行时加载。