Codefluent在Saas解决方案中分离数据库

时间:2015-11-24 10:35:43

标签: saas codefluent

我有一个使用CodeFluent构建的应用程序,它作为SAAS解决方案托管。它使用Ms Azure数据库作为存储,但现在所有客户都在同一个数据库中。考虑到SAAS解决方案的最佳实践,最好将数据库分开。从安全角度来看,备份/恢复单独的客户端数据会更容易。我们想使用Azure弹性数据库池。

然而,这并不是很简单。 Codefluent使用在web.config中设置的固定数据库连接。如果我能以某种方式更改它,我如何确定要使用的数据库。并不总是会话或httpcontext ...有没有人有同样的挑战,你是如何解决它的?

1 个答案:

答案 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();
}