【问题标题】:Multi-Tenancy in WebformsWeb 表单中的多租户
【发布时间】:2019-04-04 09:30:49
【问题描述】:

我已经成功地使用 Saaskit 在 MVC 应用程序中实现了多租户。应用程序为每个租户都有一个单独的数据库。我想在 webforms 项目中实现类似的东西。谁能指出我正确的方向?甚至可能吗?

必须有:

  • 基于域/url的租户检测
  • 必须支持每个租户的 db

【问题讨论】:

    标签: asp.net webforms multi-tenant


    【解决方案1】:

    设法使用 Webforms 4.7.2 中的新 Unity 支持来支持这一点:

    public class TenantResolver : ITenantResolver
    {
    
        public Tenant GetTenant()
        {
    
            var identifier = HttpContext.Current.Request.Url.Host.ToLower();
    
            return AllTenants().FirstOrDefault(x => x.HostNames.Any(a => a.Hostname.Contains(identifier)));
    
        }
    
        public List<Tenant> AllTenants()
        {
    
            // return list of tenants from configuration or seperate db
    
        }
    }
    

    在启动中

    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    
        var container = this.AddUnity();
    
        container.RegisterType<ITenantResolver, TenantResolver>();
        container.RegisterType<ApplicationContext, ApplicationContext>();
    
    }
    

    可访问租户的示例页面

    public partial class About : Page
    {
        readonly Tenant tenant;
        readonly ApplicationContext _context;
    
        public About(ITenantResolver tenantresolver, ApplicationContext context)
        {
            tenant = tenantresolver.GetTenant();
    
            _context = context;
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    }
    

    每个租户都有 db 的示例 db 上下文

    public class ApplicationContext : DbContext
        {
    
            public ApplicationContext(ITenantResolver tenantResolver) : base(ConnectionStringResolver(tenantResolver)) {
    
            }
    
            private string ConnectionStringResolver(AppTenant appTenant)
            {
    
                var tenant = tenantResolver.GetTenant();
    
                if (tenant != null)
                {
    
                    return tenant.ConnectionString;
    
                }
    
                throw new NullReferenceException("Tenant Not Found");
    
            }
    
        }
    

    【讨论】:

      【解决方案2】:

      默认会员 API 应该可以满足要求。

      如果没有,请考虑http://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider

      参考教程> http://www.asp.net/security/tutorials

      视频http://www.asp.net/security/videos

      上述教程中解释了最佳做法。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-08
      • 2018-05-07
      • 1970-01-01
      • 2018-06-02
      • 2018-11-13
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      相关资源
      最近更新 更多