我有一个使用CodeFluent构建的应用程序,它作为SAAS解决方案托管。它使用Ms Azure数据库作为存储,但现在所有客户都在同一个数据库中。考虑到SAAS解决方案的最佳实践,最好将数据库分开。从安全角度来看,备份/恢复单独的客户端数据会更容易。我们想使用Azure弹性数据库池。
然而,这并不是很简单。 Codefluent使用在web.config中设置的固定数据库连接。如果我能以某种方式更改它,我如何确定要使用的数据库。并不总是会话或httpcontext ...有没有人有同样的挑战,你是如何解决它的?
答案 0 :(得分:3)
每个用户只有一个数据库。这意味着您需要在对数据库进行查询之前更改连接字符串。使用CodeFluent实体,您可以在运行时更改连接字符串:
CodeFluentPersistence
或者您可以创建自定义public class MultiTenantPersistence : CodeFluentPersistence
{
public MultiTenantPersistence(CodeFluentContext context) : base(context)
{
}
public override string ConnectionString
{
get
{
return GetCurrentTenantConnectionString();
}
set
{
base.ConnectionString = value;
}
}
private string GetCurrentTenantConnectionString()
{
// TODO Implement your own logic
return $"Server=sample;Database=sample_{Context.User.UserName};Trusted_Connection=True;";
}
}
:
MultiTenantPersistence
然后您需要在配置文件中注册<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="Samples" type="CodeFluent.Runtime.CodeFluentConfigurationSectionHandler, CodeFluent.Runtime" />
</configSections>
<Samples persistenceHookTypeName="Sample.MultiTenantPersistence, Sample" />
</configuration>
:
public static String combine(String str1,String str2) {
StringBuilder result = new StringBuilder();
int str1size = str1 == null ? 0 : str1.length();
int str2size = str2 == null ? 0 : str2.length();
int lowerSize = Math.min(str1size, str2size);
int greaterSize = Math.max(str1size, str2size);
int i; // define the counter variable outside of a for, because we will reuse it in the following for loops
for (i=0; i < lowerSize; i++) { // browse the common part of the strings
result.append(str1.charAt(i)).append(str2.charAt(i));
}
for (int upTo = Math.min(greaterSize, str1size); i < upTo ; i++) { // browse the remaining part of str1, if applicable
result.append(str1.charAt(i));
}
for (int upTo = Math.min(greaterSize, str2size); i < upTo; i++) { // browse the remaining part of str2, if applicable
result.append(str2.charAt(i));
}
return result.toString();
}