2011-05-08 210 views
0

我正在编写一个利用多租户的应用程序,如Zack Owens所述。多租户MVC 3查看模型的应用程序问题

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

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

我们大部分(如果不是全部)视图都通过了视图模型。我希望View Model类驻留在租户应用程序项目中,而不是在主应用程序项目中,因此租户可以使自定义视图模型与自定义视图一起使用。

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

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

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

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

传递到字典的模型产品类型“Sample.Models.Login”,但这部词典需要类型“Sample.Models的模型项目。登录'。

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

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

谢谢你

+0

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

回答

0

不知道我明白,但我会去的。

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

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

也就是说,一个房客可以在每个页面的顶部放置一个迷你篮子,而其他房客则不会,所以您会认为他们需要自定义视图模型来包含篮子数据。然而,更好的方法是修改该租户的母版页,例如(在Razor中)包含对@ Html.RenderAction(“minibasket”)的调用,并且该操作将负责获取额外的购物篮数据。另外,如果你想像亚当建议的那样编译你的视图,那么另外一个选择就是看RazorGenerator