我正在尝试使用ASP.Net Core v1.1.0创建多租户Web应用程序。单个用户可能属于多个租户(即 - 监督多个商店的区域经理。)用户还应该能够访问该站点并查看一些基本的营销视图,而无需登录或拥有任何租户的访问权限,但是功能将受到很大限制。
从结构上讲,到目前为止,我的项目还没有从默认的ASP.Net Core MVC模板发展出来......
在Startup.cs
中,我已按如下方式定义路由,以尝试使用子域来定义用户尝试登录的存储。 “DEMO”表示用户应该只看到营销视图:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{tenant=DEMO}/{controller=Home}/{action=Index}/{id?}");
});
由于我已经这样做了,变量tenant
可以在这样的控制器动作定义中神奇地使用,并且它可以正常工作:
public IActionResult Contact(string tenant)
{
ViewData["Message"] = "Your contact page for " + tenant + ".";
return View();
}
但我使用_Layout.cshtml
作为包含大部分网站导航和一些个性化元素的包装器,我想做的事情就是禁用DEMO租户的大部分导航并显示商店特定的徽标对于所有其他租户。因为据我所知,没有与_Layout.cshtml
相关联的控制器,我需要一种不同的方式来注入这个字符串。我尝试将以下行添加到_ViewImports.cshtml
:
@inject System.String tenant
我收到错误InvalidOperationException: No service for type 'System.String' has been registered.
这让我相信我需要在ConfigureServices
中向Startup.cs
方法添加内容,但我不知道我在做什么并且无法在线找到任何类似的代码示例。我想象这样的东西:
services.AddScoped<ITenantFactory, MySeeminglyUnnecessaryFactory>();
但即便如此,我不知道如何将tenant
路由参数提供给工厂,或者如何实现它。如果我能找到一个传入字符串的罐装方法,我确信我可以使用它来做我需要做的事情,只要改变布局的外观和感觉,我觉得很容易限制用户访问在控制器级别。提前感谢任何建议或想法!
答案 0 :(得分:2)
只需使用查看上下文:
template <class... Ts>
void foo(std::tuple<Ts...> t) {
std::apply([](auto&... args) {
(std::cout << ... << args);
}, t);
}
https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageBase.cs