windows azure multi-tenant applicatie
DESCRIPTION
Windows Azure Multi-tenant applicatie. Bouwen van een multi-tenant applicatie in de praktijk. Edo van Asseldonk. Ordina Microsoft Solutions. Agenda. Introductie / Architectuur URL strategie / Tenant id Data opslag (SQL Azure, Table Storage) Maatwerk (UI / Business Logica) Cache - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/1.jpg)
Windows AzureMulti-tenant applicatieBouwen van een multi-tenant applicatie in de praktijk
1
![Page 2: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/2.jpg)
Edo van AsseldonkOrdina Microsoft Solutions
![Page 3: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/3.jpg)
3Agenda
• Introductie / Architectuur
• URL strategie / Tenant id
• Data opslag (SQL Azure, Table Storage)
• Maatwerk (UI / Business Logica)
• Cache
• Access Control Service
![Page 4: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/4.jpg)
4MultitenancyDefinitie
![Page 5: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/5.jpg)
5MultitenancyDefinitie
…single instance of software serving multiple clients (tenants)…
…een enkele softwareinstantie die meerdere klanten bedient…
![Page 6: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/6.jpg)
6MultitenancyDefinitie
![Page 7: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/7.jpg)
7MultitenancyDefinitie
![Page 8: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/8.jpg)
8MultitenancyDefinitie
Iedere tenant heeft:
• eigen data
• eigen opmaak
• eigen business logic
• gemeenschappelijke codebase
• gemeenschappelijk datamodel
![Page 9: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/9.jpg)
9ArchitectuurOverview
Casus / Demo
![Page 10: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/10.jpg)
10ArchitectuurOverview
Webrole SQL Azure
Table Storage
ACS
![Page 11: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/11.jpg)
11ArchitectuurOverview
Webrole SQL Azure
Table Storage
ACS
![Page 12: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/12.jpg)
12ArchitectuurOverview
Eisen:
• Tenantapplicatie bereikbaar via eigen url
• Eén database schema
• Eigen stijl per tenant
• Self service
• Share everything
![Page 13: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/13.jpg)
URL Strategie / Tenant id
![Page 14: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/14.jpg)
14URL Strategie / Tenant idOpties
Optie 1: Tenant bepalen a.d.h.v. ingelogde gebruiker
http://www.MyMultitenantApp.nl/Home
Geen referentie naar naam van tenant
![Page 15: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/15.jpg)
15URL Strategie / Tenant idOpties
https://www.chatter.com/nl/
![Page 16: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/16.jpg)
16URL Strategie / Tenant idOpties
https://eu1.salesforce.com/home/home.jsp
![Page 17: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/17.jpg)
17URL Strategie / Tenant idOpties
Optie 2: TenantId in URL
http://www.MyTenantApp.nl/Home?tenantId=17
http://www.MyTenantApp.nl/17/Home
http://www.MyTenantApp.nl/A219F47cd-898B/Home
http://www.MyTenantApp.nl/WazugNL/Home
![Page 18: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/18.jpg)
18URL Strategie / Tenant idOpties
Optie 3: Tenant bepalen a.d.h.v. URL
http://tenant1.MyTenantApp.nl/Home
http://tenant2.MyTenantApp.nl/Home
![Page 19: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/19.jpg)
19URL Strategie / Tenant idOpties
Optie 3: Tenant bepalen a.d.h.v. URL
http://tenant1.MyTenantApp.nl/Home
http://tenant2.MyTenantApp.nl/Home
http://www.customdomain.nl/
-> verwijst naar http://tenant2.MyTenantApp.nl
![Page 20: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/20.jpg)
20URL Strategie / Tenant idOpties
http://gaming.stackexchange.com/
![Page 21: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/21.jpg)
21URL Strategie / Tenant idOpties
http://programmers.stackexchange.com/
![Page 22: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/22.jpg)
22URL Strategie / Tenant idOpties
http://www.stackoverflow.com/
![Page 23: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/23.jpg)
23URL StrategieIn Windows Azure
[MyMultitenantApp].cloudapp.net
![Page 24: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/24.jpg)
24URL StrategieIn Windows Azure
[MyMultitenantApp].cloudapp.net
[Tenant].cloudapp.net
[Tenant].[MyMultitenantApp].cloudapp.net
![Page 25: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/25.jpg)
25URL StrategieIn Windows Azure
[MyMultitenantApp].cloudapp.net
Domain name: MyMultitenantApp.nl
![Page 26: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/26.jpg)
26URL StrategieIn Windows Azure
[MyMultitenantApp].cloudapp.net
Domain name: MyMultitenantApp.nl
URLs:
http://tenant1.MyMultitenantApp.nl
http://tenant2.MyMultitenantApp.nl
http://www.customdomain.nl
![Page 27: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/27.jpg)
Data
Database
![Page 28: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/28.jpg)
28DatabaseIntroductie
Alle tenants in dezelfde database
Twee issues:
• Limiet aan databasegrootte
• Limiet aan verwerkingscapaciteit (CPU, I/O etc.)
![Page 29: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/29.jpg)
29DatabaseIntroductie
Oplossing:
• Database splitsen
![Page 30: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/30.jpg)
30DatabaseIntroductie
Oplossing:
• Database splitsen -> SQL Azure Federations
![Page 31: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/31.jpg)
DatabaseIntroductie
![Page 32: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/32.jpg)
DatabaseIntroductie
![Page 33: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/33.jpg)
DatabaseIntroductie
![Page 34: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/34.jpg)
DatabaseIntroductie
![Page 35: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/35.jpg)
DatabaseIntroductie
![Page 36: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/36.jpg)
DatabaseIntroductie
![Page 37: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/37.jpg)
DatabaseIntroductie
![Page 38: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/38.jpg)
DatabaseIntroductie
![Page 39: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/39.jpg)
DatabaseIntroductie
![Page 40: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/40.jpg)
DatabaseIntroductie
![Page 41: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/41.jpg)
DatabaseIntroductie
![Page 42: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/42.jpg)
DatabaseIntroductie
![Page 43: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/43.jpg)
DatabaseIntroductie
![Page 44: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/44.jpg)
DatabaseIntroductie
![Page 45: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/45.jpg)
45SQL Azure FederationsRoot database
Root DBRoot
Table1Root
Table2
RootTable…
![Page 46: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/46.jpg)
46SQL Azure FederationsCreate federation
Member DBRoot DBRoot
Table1Root
Table2
RootTable…
![Page 47: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/47.jpg)
47SQL Azure FederationsCreate tables
Member DBRoot DBRoot
Table1Root
Table2
RootTable…
MemberTable1
Member Table2
Member Table…
![Page 48: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/48.jpg)
48SQL Azure FederationsSplit federation member
Member DBRoot DBRoot
Table1Root
Table2
RootTable…
MemberTable1
Member Table2
Member Table…
![Page 49: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/49.jpg)
49SQL Azure FederationsSplit federation member
Member DBRoot DBRoot
Table1Root
Table2
RootTable…
MemberTable1
Member Table2
Member Table…
![Page 50: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/50.jpg)
50SQL Azure FederationsSplit federation member
Member DBRoot DBRoot
Table1Root
Table2
RootTable…
MemberTable1
Member Table2
Member Table…
Member DBMemberTable1
Member Table2
Member Table…
Member DBMemberTable1
Member Table2
Member Table…
![Page 51: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/51.jpg)
51SQL Azure FederationsSplit federation member
Root DBRoot
Table1Root
Table2
RootTable…
Member DBMemberTable1
Member Table2
Member Table…
Member DBMemberTable1
Member Table2
Member Table…
![Page 52: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/52.jpg)
52SQL Azure FederationsVoordelen
•DB Size van max 150 GB -> 75 TB
•CPU Cores en I/O verveelvoudigd
•Real-time
•Geen downtime
![Page 53: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/53.jpg)
53SQL Azure FederationsVoordelen
•DB Size van max 150 GB -> 75 TB
•CPU Cores en I/O verveelvoudigd
•Real-time
•Geen downtime
![Page 54: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/54.jpg)
54SQL Azure FederationsVoordelen
•DB Size van max 150 GB -> 75 TB
•CPU Cores en I/O verveelvoudigd
•Real-time
•Geen downtime
![Page 55: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/55.jpg)
55SQL Azure FederationsVoordelen
•DB Size van max 150 GB -> 75 TB
•CPU Cores en I/O verveelvoudigd
•Real-time
•Geen downtime
![Page 56: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/56.jpg)
56SQL Azure FederationsKosten
Sinds halverwege februari 2012 prijsverlaging.
Tot 78% goedkoper.
Hoe meer tenants per member database, hoe goedkoper.
Eén database Meerdere databasesFORMAAT KOSTEN FORMAAT KOSTEN
10 GB $45,95 p/m 10 x 1 GB 10 x $9.99 = $99,90 p/m
![Page 57: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/57.jpg)
57SQL Azure FederationsKosten
Sinds halverwege februari 2012 prijsverlaging.
Tot 78% goedkoper.
Hoe meer tenants per member database, hoe goedkoper.
Eén database Meerdere databasesFORMAAT KOSTEN FORMAAT KOSTEN
10 GB $45,95 p/m 10 x 1 GB 10 x $9.99 = $99,90 p/m
50 GB $125,88 p/m 10 x 5 GB $259,80 p/m
![Page 58: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/58.jpg)
58SQL Azure FederationsKosten
Sinds halverwege februari 2012 prijsverlaging.
Tot 78% goedkoper.
Hoe meer tenants per member database, hoe goedkoper.
Eén database Meerdere databasesFORMAAT KOSTEN FORMAAT KOSTEN
10 GB $45,95 p/m 10 x 1 GB 10 x $9.99 = $99,90 p/m
50 GB $125,88 p/m 10 x 5 GB $259,80 p/m
50 GB $125,88 p/m 50 x 1 GB $499,50 p/m
![Page 59: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/59.jpg)
59SQL Azure FederationsKosten
Sinds halverwege februari 2012 prijsverlaging.
Tot 78% goedkoper.
Hoe meer tenants per member database, hoe goedkoper.
Eén database Meerdere databasesFORMAAT KOSTEN FORMAAT KOSTEN
10 GB $45,95 p/m 10 x 1 GB 10 x $9.99 = $99,90 p/m
50 GB $125,88 p/m 10 x 5 GB $259,80 p/m
50 GB $125,88 p/m 50 x 1 GB $499,50 p/m
150 GB $225,78 p/m 150 x 1 GB $1498,50 p/m
![Page 60: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/60.jpg)
60SQL Azure FederationsSamenwerking met Entity Framework
string federationCmdText =
"USE FEDERATION tenant_federation (tenantId = [id])
WITH FILTERING=ON, RESET";
((IObjectContextAdapter)myDatabaseContext).ObjectContext.Connection.Open();
_databaseContext.Database.ExecuteSqlCommand(federationCmdText);
var query = from o in _myDatabaseContext.Orders where o.TenantId = id select o;
![Page 61: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/61.jpg)
61SQL Azure FederationsGeen Federations in SQL Server 2008R2
string federationCmdText =
"USE FEDERATION tenant_federation (tenantId = [id])
WITH FILTERING=ON, RESET";
((IObjectContextAdapter)myDatabaseContext).ObjectContext.Connection.Open();
_databaseContext.Database.ExecuteSqlCommand(federationCmdText);
var query = from o in _myDatabaseContext.Orders
where o.TenantId = id
select o;
![Page 62: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/62.jpg)
62SQL Azure FederationsGeen where-clause nodig in gefilterde verbinding
string federationCmdText =
"USE FEDERATION tenant_federation (tenantId = [id])
WITH FILTERING=ON, RESET";
((IObjectContextAdapter)myDatabaseContext).ObjectContext.Connection.Open();
_databaseContext.Database.ExecuteSqlCommand(federationCmdText);
var query = from o in _myDatabaseContext.Orders
where o.TenantId = id
select o;
![Page 63: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/63.jpg)
63SQL Azure FederationsEntity Framework: geen support parallelle queries
![Page 64: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/64.jpg)
64ArchitectuurOverview - > Table Storage
Webrole SQL Azure
Table Storage
ACS
![Page 65: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/65.jpg)
65Table storageMeten en Afrekenen
Afrekenen op basis van verbruik
(aantal page requests, aantal objecten etc.)
Verbruik inzichtelijk maken voor tenants
Statcounter.com is niet geschikt voor multitenancy
![Page 66: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/66.jpg)
Maatwerk
![Page 67: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/67.jpg)
67Maatwerk
Maatwerk per tenant op twee gebieden:
• User Interface
• Business Logic
![Page 68: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/68.jpg)
68MaatwerkUser Interface
Tenant-logo
<div id="header">
<a href="/" class="logo" style="background: url(@ViewBag.Logo) no-repeat;">
![Page 69: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/69.jpg)
69MaatwerkUser Interface
Tenant-logo
<div id="header">
<a href="/" class="logo" style="background: url(@ViewBag.Logo) no-repeat;">
Niet doen op deze manier:
Kleuren
Fonts
Posities van html-elementen
Etc.
![Page 70: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/70.jpg)
70MaatwerkUser Interface - Themes
![Page 71: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/71.jpg)
71MaatwerkUser Interface - Themes
![Page 72: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/72.jpg)
72MaatwerkUser Interface - Themes
public class ThemesViewEngine : BuildManagerViewEngine{ private readonly string _themeName;
public ThemesViewEngine(string themeName) { _themeName = themeName; }
protected override IView CreateView( ControllerContext controllerContext, string viewPath, string masterPath) { masterPath = string.Format("~/Themes/{0}/_Layout.cshtml", _themeName);
return new RazorView(controllerContext, viewPath, masterPath, …); }
![Page 73: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/73.jpg)
73MaatwerkUser Interface - Themes
public class ThemesViewEngine : BuildManagerViewEngine{ private readonly string _themeName;
public ThemesViewEngine(string themeName) { _themeName = themeName; }
protected override IView CreateView( ControllerContext controllerContext, string viewPath, string masterPath) { masterPath = string.Format("~/Themes/{0}/_Layout.cshtml", _themeName);
return new RazorView(controllerContext, viewPath, masterPath, …); }
![Page 74: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/74.jpg)
74MaatwerkUser Interface - Themes
public class ThemesViewEngine : BuildManagerViewEngine{ private readonly string _themeName;
public ThemesViewEngine(string themeName) { _themeName = themeName; }
protected override IView CreateView( ControllerContext controllerContext, string viewPath, string masterPath) { masterPath = string.Format("~/Themes/{0}/_Layout.cshtml", _themeName);
return new RazorView(controllerContext, viewPath, masterPath, …); }
![Page 75: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/75.jpg)
75MaatwerkUser Interface - Themes
public class ThemesViewEngine : BuildManagerViewEngine{ private readonly string _themeName;
public ThemesViewEngine(string themeName) { _themeName = themeName; }
protected override IView CreateView( ControllerContext controllerContext, string viewPath, string masterPath) { masterPath = string.Format("~/Themes/{0}/_Layout.cshtml", _themeName);
return new RazorView(controllerContext, viewPath, masterPath, …); }
![Page 76: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/76.jpg)
76MaatwerkUser Interface - Themes
public class UseThemesViewEngine : ActionFilterAttribute{ public ITenantSettings Settings { get; set; }
public override void OnActionExecuting( ActionExecutingContext context) { ViewEngines.Engines.Clear();
var engine = new ThemesViewEngine(Settings.ThemeName);
ViewEngines.Engines.Add(engine)); }}
![Page 77: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/77.jpg)
77MaatwerkUser Interface - Themes
public class UseThemesViewEngine : ActionFilterAttribute{ public ITenantSettings Settings { get; set; }
public override void OnActionExecuting(…) { ViewEngines.Engines.Clear();
var engine = new ThemesViewEngine(Settings.ThemeName);
ViewEngines.Engines.Add(engine)); }}
![Page 78: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/78.jpg)
78MaatwerkUser Interface - Themes
Public class HomeController : Controller{ [UseThemesViewEngine] public ActionResult Index() { }}
![Page 79: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/79.jpg)
79MaatwerkUser Interface - Themes
public class UseThemesViewEngine : ActionFilterAttribute{ public ITenantSettings Settings { get; set; }
public override void OnActionExecuting( ActionExecutingContext context) { ViewEngines.Engines.Clear();
var engine = new ThemesViewEngine(Settings.ThemeName);
ViewEngines.Engines.Add(engine)); }}
![Page 80: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/80.jpg)
80Maatwerk
Maatwerk per tenant op twee gebieden:
• User Interface
• Business Logic
![Page 81: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/81.jpg)
81MaatwerkBusiness Logic
Probleem
• Tenant settings moeten continue doorgegeven worden
• If-statements en switch-statements door alle code verweven
![Page 82: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/82.jpg)
82MaatwerkBusiness Logic
var data = Foo.Bar(TenantSettings)
If(settings.IsGoldPartner) …else …
TenantSettings
Business Logic layer
MVC Controller
![Page 83: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/83.jpg)
83MaatwerkBusiness Logic
var data = Foo.Bar(TenantSettings)
If(settings.IsGoldPartner) …else …
TenantSettings
Business Logic layer
MVC Controller
![Page 84: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/84.jpg)
84MaatwerkBusiness Logic
var data = BLL.GetData(TenantId)
return DA.GetData(TenantId)
from t in tablewhere tenantid == TenantIdselect t
select * from tablewhere tenantid = TenantId
TenantId
TenantId
TenantId
Business Logic layer
MVC Controller
Data Access
Database
![Page 85: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/85.jpg)
85MaatwerkBusiness Logic
var data = BLL.GetData(TenantId)
return DA.GetData(TenantId)
from t in tablewhere tenantid == TenantIdselect t
select * from tablewhere tenantid = TenantId
TenantId
TenantId
TenantId
Business Logic layer
MVC Controller
Data Access
Database
![Page 86: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/86.jpg)
86MaatwerkBusiness Logic
public class BusinessLogic{ public void DoeIets(string messageText) { var message = CreateMessage(messageText);
var tenantSettings = TenantSettingsHelper.GetSettings();
if(tenantSettings.UseSpamFilter) { if(tenantSettings.SpamFilterType == Fast) { spamfilter = new FastSpamfilter().Execute(message); } else if(TenantSettings.SpamFilterType == Slow) { spamfilter = new SlowSpamfilter().Execute(message); } }
SaveMessage(message); }
![Page 87: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/87.jpg)
87MaatwerkBusiness Logic
IoC container (autofac):builder.Register(c => NewSpamfilter()) .As<ISpamfilter>;
private Ispamfilter NewSpamfilter(){ if(!TenantSettings.UseSpamFilter) return new NoSpamfilter();
if(TenantSettings.SpamFilterType == Fast) return new FastSpamfilter();
else if(TenantSettings.SpamFilterType == Slow) return new SlowSpamfilter();
![Page 88: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/88.jpg)
88MaatwerkBusiness Logic
public class BusinessLogic{ ISpamfilter _spamfilter; public Messenger(ISpamfilter spamfilter) { _spamfilter = spamfilter }
public void DoeIets(string messageText) { var message = CreateMessage(messageText); _spamfilter.Execute(message); SaveMessage(message); }
![Page 89: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/89.jpg)
89Cache
App Fabric Cache doet de basics
Wissen van totale cache niet mogelijk
Geen persistentie
Geen inzicht in bytes per tenant
Versienummer in cachekey:
Bijvoorbeeld [tenantId]_[objecttype]_[versienr]_[objectId]2ED669F2-9EBC-4248-8BE2-56CDFDA89B75_employee_v1.1_924F32EA-7793-46C1-986E-69FF0857F39C
2ED669F2-9EBC-4248-8BE2-56CDFDA89B75_employee_v1.2_924F32EA-7793-46C1-986E-69FF0857F39C
Cache
![Page 90: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/90.jpg)
90Cache
• App Fabric Cache doet de basics, maar niet meer dan dat.
• Wissen van totale cache niet mogelijk.
• Geen persistentie.
• Geen inzicht in bytes per tenant.
Versienummer in cachekey:
Bijvoorbeeld [tenantId]_[objecttype]_[versienr]_[objectId]
![Page 91: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/91.jpg)
91Access Control Service
Access Control
![Page 92: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/92.jpg)
92Access Control ServiceIntro
Iedere tenant -> Relying Party Application in ACS
Management Service (beschikbaar als Odata Service)
Geen gebruikcijfers
![Page 93: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/93.jpg)
93Access Control ServiceAudienceMode
Na inloggen stuurt ACS een token naar de website.
Check (url in token == AllowedAudienceUri)
Uitzetten!
<microsoft.identityModel>
<service>
<audienceUris mode="Never">
![Page 94: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/94.jpg)
94ContactBereikbaar voor vragen
Edo van Asseldonk
Email: [email protected]
Twitter: @edovanasseldonk
Blog: http://edo-van-asseldonk.blogspot.com
![Page 95: Windows Azure Multi-tenant applicatie](https://reader035.vdocuments.net/reader035/viewer/2022062809/56815a37550346895dc7768b/html5/thumbnails/95.jpg)
95
www.ordina.nl