【问题标题】:Multi Tenant MVC 3 App with View Model Problem具有视图模型问题的多租户 MVC 3 应用程序
【发布时间】:2011-08-21 06:27:51
【问题描述】:

我正在编写一个利用 Zack Owens 概述的多租户的应用程序。

在 Zack 的示例中,他有单独的 c# 类库来存储每个租户的控制器和视图。由于我没有使用已编译视图的 Spark View 引擎,因此这不是一个选项。相反,我为每个租户创建了一个单独的 MVC3 应用程序项目,并在其中存储内容、控制器、视图等。

我有一个主 MVC 应用程序项目(它是启动应用程序),它带有一个自定义控制器工厂,它扫描类似于 Zacks 示例的程序集并使用结构映射设置依赖注入。我有一个视图引擎,它使用控制器上下文来获取正确的视图。如果在租户应用程序中找不到视图或依赖项,它将使用我们主 MVC 应用程序项目中的视图或依赖项。除了视图模型之外,一切都很棒。

我们的大部分(如果不是全部)视图都传递给视图模型。我希望 View Model 类驻留在租户应用程序项目中,而不是主应用程序项目中,以便租户可以拥有自定义视图模型以配合他们的自定义视图。

它似乎可以工作,但我不断收到错误。

场景 #1 - 默认视图模型驻留在主 MVC 应用程序项目中。租户应用程序具有对主应用程序的引用,因此可以使用默认视图模型。没问题。现在,当我想添加视图模型或覆盖视图模型时,我会创建类并将其放入租户应用程序中。问题是当您调用页面时,主 MVC 应用程序找不到新的视图模型,因为主应用程序没有对租户应用程序的引用,并且它们不能是由于循环引用问题。

场景 #2 - 我从租户应用程序中删除了对主应用程序的引用。然后我将默认视图模型从主应用程序复制到租户应用程序,更改命名空间,并创建从主应用程序到租户应用程序的引用,以便主应用程序可以访问视图模型类。

然后我运行它并得到以下错误:

传入字典的模型项是“Sample.Models.Login”类型的,但该字典需要一个“Sample.Models.Login”类型的模型项。

这个错误是有道理的,但不是真的。我只有一个名为 Sample.Models.Login 的类

我对为什么会这样做有一些假设,但我无法弄清楚。任何提示或建议将不胜感激。

谢谢

【问题讨论】:

  • 仅供参考,您可以编译您的观点。右键单击项目以将其卸载,然后右键单击以编辑它,然后将第一组 (MvcBuildViews) 中的最后一项设置为 true 而不是 false。保存并重新加载项目并编译。

标签: asp.net-mvc asp.net-mvc-3 multi-tenant


【解决方案1】:

不确定我是否理解,但无论如何我都会尝试。

首先,如果您需要不同的视图模型,您可能应该有不同的控制器/动作。也许您只是想添加一些额外的信息 - 在这种情况下,自定义视图模型应该基于原始视图模型。您可以通过将主视图模型移动到单独的组件中来解决圆形循环参考问题。您还可以使用插件框架(例如 Managed Extensibility Framework)来管理参考问题。

但是,对于任何给定的控制器/动作,视图主要部分的数据需求应该是相当恒定的,而与租户无关。如果它需要不同的数据,它可能不会做完全相同的事情,应该采取不同的行动。

也就是说,例如,一个租户可能在每个页面的顶部都有一个迷你购物篮,而其他租户则没有,因此您会认为他们需要自定义视图模型来包含购物篮数据。但是,更好的方法是更改​​该租户的母版页,例如(在 Razor 中)包含对 @Html.RenderAction("minibasket") 的调用,并且该操作将负责获取额外的购物篮数据。

顺便说一句,如果您想像 Adam 建议的那样整理您的观点,另一种选择是查看 RazorGenerator

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 2013-07-02
    • 2011-08-25
    • 2020-06-09
    • 1970-01-01
    • 2013-03-24
    • 2015-12-16
    • 2018-04-05
    相关资源
    最近更新 更多