具有视图模型问题的多租户MVC 3应用程序

时间:2011-05-08 20:24:06

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

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

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

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

我们的大多数(如果不是全部)视图都传递了一个视图模型。我希望View Model类驻留在Tenant App Project而不是Main App Project中,因此租户可以使用自定义视图模型来使用自定义视图。

看起来它会起作用,但我一直在犯错误。

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

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

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

传入字典的模型项的类型为“Sample.Models.Login”,但此字典需要“Sample.Models.Login”类型的模型项。

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

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

谢谢

1 个答案:

答案 0 :(得分:0)

不确定我明白但是我还是会去。

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

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

也就是说,一个租户可以在每个页面的顶部放置一个迷你篮子,而其他租户则没有,所以你会认为他们需要自定义视图模型来包含篮子数据。但是,更好的方法是更改​​该租户的母版页以包含对@ Html.RenderAction(“迷你小块”)的调用(例如Razor),并且该操作将负责获取附加内容篮子数据。

另外,如果你想像Adam建议的那样编译你的观点,另外一个选择就是看看RazorGenerator