Created
December 17, 2015 22:06
-
-
Save dataneek/3d05dda1e28e18ef822a to your computer and use it in GitHub Desktop.
Factory Method, Multitenancy, StructureMap, and Other Stuff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using StructureMap; | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
var container = new Container(t => | |
{ | |
t.Scan(scan => | |
{ | |
scan.AssemblyContainingType<Program>(); | |
scan.WithDefaultConventions(); | |
scan.AddAllTypesOf<IEmailContentBuilder>(); | |
}); | |
}); | |
var tenant1 = new Tenant { TenantId = "abc", CommonName = "ABC Tenant" }; | |
var tenant2 = new Tenant { TenantId = "zyx", CommonName = "ZYX Tenant" }; | |
var factory = container.GetInstance<IEmailContentBuilderFactory>(); | |
var builder1 = factory.GetBuilder(tenant1); | |
var builder2 = factory.GetBuilder(tenant2); | |
var result1 = builder1.GenerateContent(tenant1); | |
var result2 = builder2.GenerateContent(tenant2); | |
Console.WriteLine(result1.MessageBody); | |
Console.WriteLine(result2.MessageBody); | |
} | |
} | |
public interface ITenant | |
{ | |
string TenantId { get; } | |
string CommonName { get; } | |
} | |
public class Tenant : ITenant | |
{ | |
public string TenantId { get; set; } | |
public string CommonName { get; set; } | |
} | |
public interface ITenantOverride | |
{ | |
bool IsForThisTenant(ITenant tenant); | |
} | |
public class EmailContent | |
{ | |
public string MessageBody { get; set; } | |
} | |
public interface IEmailContentBuilder | |
{ | |
EmailContent GenerateContent(ITenant tenant); | |
} | |
public interface IDefaultImplementation | |
{ | |
} | |
public interface IEmailContentBuilderFactory | |
{ | |
IEmailContentBuilder GetBuilder(ITenant tenant); | |
} | |
public class EmailContentBuilderFactory : IEmailContentBuilderFactory | |
{ | |
private readonly IEnumerable<IEmailContentBuilder> emailContentBuilders; | |
private readonly IEmailContentBuilder defaultEmailContentBuilder; | |
public EmailContentBuilderFactory(IEnumerable<IEmailContentBuilder> emailContentBuilders) | |
{ | |
this.emailContentBuilders = emailContentBuilders; | |
this.defaultEmailContentBuilder = | |
this.emailContentBuilders | |
.OfType<IDefaultImplementation>() | |
.OfType<IEmailContentBuilder>() | |
.FirstOrDefault(); | |
} | |
IEmailContentBuilder IEmailContentBuilderFactory.GetBuilder(ITenant tenant) | |
{ | |
var result = GetTenantSpecificEmailContentBuilder(tenant); | |
if (result == null) | |
result = defaultEmailContentBuilder; | |
if (result == null) | |
result = emailContentBuilders.FirstOrDefault(); | |
if (result == null) | |
throw new ArgumentNullException(); | |
return result; | |
} | |
private IEmailContentBuilder GetTenantSpecificEmailContentBuilder(ITenant tenant) | |
{ | |
var result = | |
this.emailContentBuilders | |
.OfType<ITenantOverride>() | |
.Where(t => t.IsForThisTenant(tenant)) | |
.OfType<IEmailContentBuilder>() | |
.FirstOrDefault(); | |
return result; | |
} | |
} | |
public class DefaultEmailContentBuilder : IEmailContentBuilder, IDefaultImplementation | |
{ | |
private const string MessageBodyTemplate = "This is default content for {0}."; | |
EmailContent IEmailContentBuilder.GenerateContent(ITenant tenant) | |
{ | |
return new EmailContent | |
{ | |
MessageBody = | |
string.Format(MessageBodyTemplate, tenant.CommonName) | |
}; | |
} | |
} | |
public class CustomEmailContentBuilder : IEmailContentBuilder, ITenantOverride | |
{ | |
private const string MessageBodyTemplate = "This is override content for {0}."; | |
EmailContent IEmailContentBuilder.GenerateContent(ITenant tenant) | |
{ | |
return new EmailContent | |
{ | |
MessageBody = | |
string.Format(MessageBodyTemplate, tenant.CommonName) | |
}; | |
} | |
bool ITenantOverride.IsForThisTenant(ITenant tenant) | |
{ | |
return tenant != null && tenant.TenantId == "abc"; | |
} | |
} | |
public class AnotherCustomEmailContentBuilder : IEmailContentBuilder, ITenantOverride | |
{ | |
private const string MessageBodyTemplate = "This is a special override content for {0}."; | |
EmailContent IEmailContentBuilder.GenerateContent(ITenant tenant) | |
{ | |
return new EmailContent | |
{ | |
MessageBody = | |
string.Format(MessageBodyTemplate, tenant.CommonName) | |
}; | |
} | |
bool ITenantOverride.IsForThisTenant(ITenant tenant) | |
{ | |
return tenant != null && tenant.TenantId == "xyz"; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment