gpt4 book ai didi

asp.net-mvc-3 - MVC3 - Multi-Tenancy 应用程序

转载 作者:行者123 更新时间:2023-12-01 23:34:29 25 4
gpt4 key购买 nike

我正在构建一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com