基于同一模板处理多个ASP.NET网站的代码

时间:2019-01-09 14:26:17

标签: c# asp.net-mvc

我正在使用ASP.NET MVC,并且必须基于第一个网站开发和部署多个网站。 每个网站上的某些控制器,某些视图,某些脚本和某些模型有所不同,并且数据库不同(主要是列不同,但表名保持不变)。 有没有一种方法可以在单个Visual Studio项目中处理此类问题,从而使维护变得更容易,并且能够轻松地在每个网站上添加通用功能?

当前,我将领航项目复制到新的VS项目中,并更改所有变体。但是我发现这不是理想的情况(因为需要维护/改进)。

1 个答案:

答案 0 :(得分:0)

几年前,我已经实现了类似的功能,并且可以提供一些可能有用的一般建议。

首先,正在开发具有这种“多租户”功能的应用程序与MVC模式本身无关。您可以在没有MVC:D的情况下进行操作。其次,如果网站应该与不同的业务领域合作,那么恐怕没有通用的方式来做您想要的事情。就我而言,这只是许多电子商务平台。

无论如何,请考虑接下来的事情。

1。请考虑使用子域方法。它将使您摆脱愚蠢的路由和cookie恶作剧。基本上,您可以将*.yourdomain.com映射到一个应用程序,并轻松处理与租户相关的必要逻辑。因此,在我的情况下,该应用程序的行为会有所不同,具体取决于所提供的URL(而不是路由),而取决于子域(例如'superclient.yourdomain.com')。它并不总是可能或好主意,但请考虑一下。

2。依赖注入无处不在。好吧,它通常很有用,但是在您的情况下绝对是必须具备的-尝试以单独的类型抽象任何特定于租户的逻辑,并将它们放在一个位置。它与本地化,时区设置,应用程序主题,应用程序标题上的品牌信息等有关。只需初始化并在需要的地方插入即可。如果你有类似的东西

if (website1) {
    showBlockOne();
} else if (website2) {
    showBlockTwo();
} else if (website3) {
    showBlockThree();
}

然后您做错了事,这是通往精神错乱的道路。应该是

_currentTenantViewContext.ShowBlock();

因此在大多数情况下,其在条件运算符上的多态性。

3。就我而言,要求是创建一个可以使用任何语言的应用程序,因此我也必须在数据库方面处理该问题。问题是,如果通常让您说出具有ProductTypeId的数据库中的Name表,在多租户应用程序中并不是那么简单。我的解决方案是创建两个表-具有ID和ProductType字段的Code和具有ID,ProductTypeLocalizationProductTypeIdLanguageId字段的Value表处理这个问题。还需要从管理面板中编辑此值...

我不知道这种情况对您有帮助,但是如果是这样,请在以后将其撞到风扇上之前考虑一下。

4。对于只需要一个站点在某些数据库表中需要某些特定字段的情况,最好不要随意生成它们(通常)。考虑使用一些通用格式,例如JSON或XML。如果您在某个表中没有几个用于特定网站的其他文本字段,则只需创建一个字段(称为ExtraSettings或其他名称),然后将此字符串作为JSON存储在该字段中。当然,您必须以单独的方式处理此数据,但是它又与依赖项注入有关。 您也可以为此使用NoSQL。

5。提供功能切换,不同的网站需要显示不同的块,应用规则等。您必须有某种方法来打开/关闭特定网站(租户),而无需重新编译/重新部署。

希望有帮助。

相关问题