- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个 Multi-Tenancy MVC3 应用程序。 何时建立租户上下文的最佳做法是什么?
我最初考虑在应用程序启动时使用依赖注入(inject),但那行不通。在应用程序启动时,我知道我可以绑定(bind)“应用程序”上下文(或主查找数据库),因为这只会因服务器环境而异。但是租户上下文可以根据请求逐个更改,并且应该通过加密的 cookie 或 http session 来持久化,我想。我认为 TempData、ViewData、ViewBag 在这里对我不起作用。
所以我的问题是,对于每个请求,我都需要验证租户上下文是否存在。如果有,就从持久化机制中抓取。否则成立。应该在 MVC 管道中的什么时候检查?
我是否应该创建一个默认 Controller ,一个提供租户检查/建立的 Action 过滤器,并用 Action 过滤器装饰 Controller ,然后让每个 Controller 都派生自默认 Controller ?
最佳答案
借助 Ninject,您可以在逐个请求的基础上使用依赖注入(inject)来确定请求针对的是哪个租户。
我这样做的方法是使用 Nuget 添加 NinjectMVC3
到我的项目,然后添加一个 App_Start/NinjectMVC3
类。此类包含一个 RegisterServices(IKernel kernel)
例程,您可以在其中注册您的依赖项。
我指定在模块中加载我的依赖项,而不是直接在此例程中加载:
private static void RegisterServices(IKernel kernel)
{
kernel.Load(new TenantConfigurationModule());
}
然后模块被指定为:
public class TenantConfigurationModule : NinjectModule
{
public override void Load()
{
IEnumerable<ITenantConfiguration> configuration = //Instantiate a list of configuration classes from where they are stored.
//Initialise a ninject provider to determine what configuration object to bind to on each request.
TenantConfigurationProvider provider = new TenantConfigurationProvider(configuration);
//And then bind to the provider specifying that it is on a per request basis.
Bind<ITenantConfiguration>().ToProvider(provider).InRequestScope();
}
}
基本配置类可以指定为:
public interface ITenantConfiguration
{
string TenantName { get; }
IEnumerable<string> UrlPaths { get; }
//whatever else you need for the tenant configuration
}
public abstract class TenantConfiguration : ITenantConfiguration
{
public string TenantName { get; protected set; }
public IEnumerable<string> UrlPaths { get; protected set; }
}
然后是指定的实际配置:
public class TenantOneConfiguration : TenantConfiguration
{
public MVTTenantConfiguration()
{
TenantName = "MVT";
UrlPaths = new string[] { "http://localhost:50094" }; //or whatever the url may be
}
}
public class TenantOneConfiguration : TenantConfiguration
{
public MVTTenantConfiguration()
{
TenantName = "MVT";
UrlPaths = new string[] { "http://localhost:50095" };
}
}
然后可以写提供者:
public class TenantConfigurationProvider : Provider<ITenantConfiguration>
{
private IEnumerable<ITenantConfiguration> configuration;
public TenantConfigurationProvider(IEnumerable<ITenantConfiguration> configuration)
{
if (configuration == null || configuration.Count() == 0)
{
throw new ArgumentNullException("configuration");
}
this.configuration = configuration;
}
protected override ITenantConfiguration CreateInstance(IContext context)
{
//Determine the request base url.
string baseUrl = string.Format("{0}://{1}", HttpContext.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Authority);
//Find the tenant configuration for the given request url.
ITenantConfiguration tenantConfiguration = configuration.Single(c => c.UrlPaths.Any(p => p.Trim().TrimEnd('/').Equals(baseUrl, StringComparison.OrdinalIgnoreCase)));
if (tenantConfiguration == null)
{
throw new TenantNotFoundException(string.Format("A tenant was not found for baseUrl {0}", baseUrl));
}
return tenantConfiguration;
}
}
然后您可以根据需要将配置注入(inject) Controller 、 View 、属性等。
以下是一些有用的链接:
通过继承 View 类在 View 中使用依赖注入(inject):see link
要查看说明和 Multi-Tenancy 示例应用程序:see link
zowens 的示例有很多内容,但在 asp.net mvc 中实现 Multi-Tenancy 并不是一项简单的任务。这个例子提供了一些很好的想法,但我用它作为实现我自己的想法的基础。此示例将每个租户配置存储在单独的 c# 项目中,然后在启动时搜索配置(您可以为此使用反射)以查找要使用的所有租户。然后,每个租户配置项目都可以存储特定于该租户的设置、 View 、覆盖的 Controller 、css、图像、javascript,而无需更改主应用程序。此示例还使用 StructureMap 进行依赖注入(inject)。我选择了 Ninject,但您可以使用任何您喜欢的方式,只要它根据请求解决即可。
此示例还使用了 Spark View 引擎,以便可以轻松地将 View 存储在其他项目中。我想坚持使用 razor View 引擎,但这有点棘手,因为必须预编译 View 。为此,我使用了 David Ebbos razor generator,它是一个优秀的 View 编译器,随预编译 View 引擎一起提供:see link
注意:如果您确实尝试在单独的项目中实现您的 View ,那么正确实现 View 引擎可能会非常棘手。我必须实现自己的 View 引擎和虚拟路径工厂才能使其正常工作,但这是值得的。
此外,如果您在单独的项目中实现资源,那么以下链接可能是有关如何从这些项目中检索信息的有用建议:see link
我也希望这有助于在您的 mvc3 应用程序中实现 Multi-Tenancy 。不幸的是,我自己没有可以上传到某个地方的示例应用程序,因为我的实现包含在工作项目的实现中。
关于asp.net-mvc-3 - MVC3 - Multi-Tenancy 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9009024/
对于我积极维护的客户基于 Web 的 CRM 的分支机构数量不断增加的 Multi-Tenancy ,我需要做出一个艰难的数据库设计决策。 我很早就决定为每个分支使用具有单独数据库的单独应用程序,因为
在 Spring 3 应用程序中,我试图通过 Hibernate 4 的原生 MultiTenantConnectionProvider 实现 Multi-Tenancy 。和 CurrentTena
在neo4j中实现 Multi-Tenancy 的最佳方法是什么? 我看过 Tinkerpop 和 Spring Data。 我有多个客户端,我想将客户端信息存储在自己的数据库中以确保安全。 我不想使
我正在一个小团队工作,设计一个流程管理系统,供同一行业内的几个不同客户使用。系统的目标和客户的高水平要求非常相似。然而,正如预期的那样——一旦我们开始深入挖掘他们的个人需求,我们最终会为每个客户进行一
我们正在开发一个“中间层”来替换现有的业务逻辑/数据访问层。我们面临的设计问题之一是,我们需要以一种允许多个客户的数据库和/或中间层部件作为我们托管产品的一部分存在于同一服务器上的方式进行设计。托管环
我有一个非常简单的项目,其中包含一个具有以下 models.py 的应用程序: class UserAccount: user = models.OneToOneField(User)
在我的应用程序中,我想为不同的客户实现 Multi-Tenancy 支持。 我有一个节点树,希望为不同的客户实现私有(private)树的支持。 Neo4j 是否支持 Multi-Tenancy ,或
我似乎找不到任何关于具有多个数据库的 Grails Multitenancy(每个租户一个)的更新资源/指南、插件或示例。我目前被困在 https://grails.org/plugin/multi-
在我的 Laravel 项目中,我使用了 Multi-Tenancy 。对于项目相关的工作,我正在创建一个 laravel 自定义 artisan 命令。我正在尝试在我正在创建的那个 artisan
我想实现 OKTA API 来管理 Multi-Tenancy 环境中的身份验证和 SSO。 每个用户都应该链接到一个租户,并且每个租户都应该配置身份验证策略。有没有办法实现这一目标? 最佳答案 Ok
我在网上阅读了几篇关于 Multi-Tenancy (针对 SaaS 应用程序中的不同客户)的文章(即 this 和 that 和 that)。一旦您决定采用基于鉴别器的方法,hibernate do
我有几个客户端使用的数据库。我真的不希望代理增量键值在客户端之间流血。我希望编号从1开始,并且要针对客户。 我将使用tenant_id的两部分组合键以及增量ID。 为每个租户创建增量 key 的最佳方
我正在开发一个定制的CRM解决方案,该解决方案将通过Web/SaaS模型出售。我预计会有数十或数百个客户使用此解决方案。我将使用MS SQL作为数据库引擎。 选项1是拥有一个数据库,并在表上包括一个T
我开始设计 Multi-Tenancy 系统并且已经阅读了这篇文章: http://msdn.microsoft.com/en-us/library/aa479086.aspx 无论如何,我有几个与身
我正在考虑在 Multi-Tenancy 应用程序中使用 Solr,我想知道是否有任何最佳实践或需要注意的事项? 一个特别的问题是每个租户拥有一个 Solr Core 是否有意义。有大量的 Solr
由于我对 redis 还很陌生,因此我正在尝试探索各种选项,看看如何使用 redis 实现 Multi-Tenancy 。 我在 redisLabs 官方页面上阅读了一些文档,看起来 redis 集群
我们有一个应用程序,可以在 Multi-Tenancy 工作区的服务器上执行大量数据繁重的工作。 以下是它所做的事情: 它从不同文件格式的文件加载数据。 根据定义的逻辑执行幂等规则。 执行处理逻辑,例
我们有一个 Multi-Tenancy Azure 广告应用程序,该应用程序在某些其他租户中不可见。是否有允许第三方应用程序的租户级别设置? 我们从 azure cli 运行以下命令来查看 hte 应
我尝试登录 Azure AD Web 应用程序,当我使用租户内的用户登录时,就可以了,但是当登录其他用户时我得到 AADSTS50020:来自身份提供商“live.com”的用户帐户“********
我正在将 Firebase 视为 MVP Multi-Tenancy 应用的后端。该应用程序将为每个租户提供完全白标,每个租户都注册自己的用户群。肯定会有交叉,用户可以注册多个租户,但是我似乎看不到
我是一名优秀的程序员,十分优秀!