lundi 23 janvier 2017

C# Architecture/Pattern for Tenant-Specific Business Logic

Say you have a multi-tenant app. A Tenant has various properties:

public class Tenant{
  public string TenantName {get; set;}
  public string TenantUrl {get; set;}
}

This way when my service layer sends emails, for example, I can do the following:

 SendEmail(Tenant.FromEmailAddress, recipientEmailAddress)

This works well for properties. In many places throughout my business logic, I'm encountering cases where tenant-specific behaviors must be accounted for. One example is retrieving photos for the homepage:

public List<string> GetPhotoUrls(){
     if(currentTenant == TenantA){
         // logic to go off to retrieve from one third party
     } else if (currentTenant == TenantB){
         // totally different logic
     } else...  // one for each tenant

     // do some stuff
     // return stuff
}

GetPhotoUrls is a simple example - but there are cases like this in many places in my business logic. I'm looking for a simple pattern where I can define and implement tenant-specific logic. The overall goal is to get all tenant-specific logic in one place so tenant creation and definition is easy.

I would like the developer experience to read along the lines of:

public List<string> GetPhotoUrls(){
     currentTenant.GetPhotoUrls(); // define this logic on the tenant object somehow
     // do some stuff
     // return stuff
}

What patterns/constructs are available to achieve this?

Aucun commentaire:

Enregistrer un commentaire