Created
April 16, 2015 03:28
-
-
Save dataneek/63bd8c677b580820a3ac to your computer and use it in GitHub Desktop.
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.ComponentModel.Composition; | |
using System.ComponentModel.Composition.Hosting; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
namespace TripIt | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()); | |
var container = new CompositionContainer(catalog); | |
var tt = container.GetExport<BusinessLogicController>().Value; | |
var tripRequest1 = new TripRequest { TripNumber = Guid.NewGuid(), TripName = "Trip #1" }; | |
var tripRequest2 = new TripRequest { TripNumber = Guid.NewGuid(), TripName = "Trip #2" }; | |
var tripRequest3 = new TripRequest { TripNumber = Guid.NewGuid(), TripName = "Trip #3" }; | |
var user1 = new User { ClientID = "A", Username = "User #1" }; | |
var user2 = new User { ClientID = "V", Username = "User #2" }; | |
var user3 = new User { ClientID = "E", Username = "User #3" }; | |
var controller = new BusinessLogicController(new TripRequestHandlerFactory(new ITripRequestHandler[] { new VectrusTripRequestHandler(), new ExellisTripRequestHandler(), new DefaultTripRequestHandler() })); | |
User.CurrentUser = user1; | |
controller.Submit(tripRequest1); | |
User.CurrentUser = user2; | |
controller.Submit(tripRequest2); | |
User.CurrentUser = user3; | |
controller.Submit(tripRequest3); | |
} | |
} | |
public class User | |
{ | |
public static User CurrentUser { get; set; } | |
public string ClientID { get; set; } | |
public string Username { get; set; } | |
} | |
public class TripRequest | |
{ | |
public Guid TripNumber { get; set; } | |
public string TripName { get; set; } | |
} | |
public interface ITripRequestHandler | |
{ | |
bool IsAuthorized(User user); | |
void Handle(TripRequest tripRequest); | |
} | |
public interface ITripRequestDefaultHandler : ITripRequestHandler | |
{ | |
} | |
[Export(typeof(ITripRequestHandler))] | |
public class VectrusTripRequestHandler : ITripRequestHandler | |
{ | |
void ITripRequestHandler.Handle(TripRequest tripRequest) | |
{ | |
Console.WriteLine("vectrus business logic applied."); | |
} | |
bool ITripRequestHandler.IsAuthorized(User user) | |
{ | |
return user.ClientID == "V"; | |
} | |
} | |
[Export(typeof(ITripRequestHandler))] | |
public class ExellisTripRequestHandler : ITripRequestHandler | |
{ | |
void ITripRequestHandler.Handle(TripRequest tripRequest) | |
{ | |
Console.WriteLine("exellis business logic applied."); | |
} | |
bool ITripRequestHandler.IsAuthorized(User user) | |
{ | |
return user.ClientID == "E"; | |
} | |
} | |
[Export(typeof(ITripRequestHandler))] | |
[Export(typeof(ITripRequestDefaultHandler))] | |
public class DefaultTripRequestHandler : ITripRequestHandler, ITripRequestDefaultHandler | |
{ | |
void ITripRequestHandler.Handle(TripRequest tripRequest) | |
{ | |
Console.WriteLine("default business logic applied."); | |
} | |
bool ITripRequestHandler.IsAuthorized(User user) | |
{ | |
return true; | |
} | |
} | |
public interface ITripRequestHandlerFactory | |
{ | |
ITripRequestHandler Create(); | |
} | |
[Export(typeof(ITripRequestHandlerFactory))] | |
public class TripRequestHandlerFactory : ITripRequestHandlerFactory | |
{ | |
private readonly IEnumerable<ITripRequestHandler> tripRequestHandlers; | |
[ImportingConstructor] | |
public TripRequestHandlerFactory([ImportMany]IEnumerable<ITripRequestHandler> tripRequestHandlers) | |
{ | |
this.tripRequestHandlers = tripRequestHandlers; | |
} | |
ITripRequestHandler ITripRequestHandlerFactory.Create() | |
{ | |
User user = User.CurrentUser; | |
foreach (var tripRequestHandler in this.tripRequestHandlers) | |
{ | |
if (!(tripRequestHandler is ITripRequestDefaultHandler)) | |
{ | |
if (tripRequestHandler.IsAuthorized(user)) | |
return tripRequestHandler; | |
} | |
} | |
return | |
this.tripRequestHandlers | |
.OfType<ITripRequestDefaultHandler>() | |
.FirstOrDefault(); | |
} | |
} | |
[Export] | |
public class BusinessLogicController | |
{ | |
private readonly ITripRequestHandlerFactory tripRequestHandlerFactory; | |
[ImportingConstructor] | |
public BusinessLogicController(ITripRequestHandlerFactory tripRequestHandlerFactory) | |
{ | |
this.tripRequestHandlerFactory = tripRequestHandlerFactory; | |
} | |
public void Submit(TripRequest tripRequest) | |
{ | |
var tripRequestHandler = this.tripRequestHandlerFactory.Create(); | |
tripRequestHandler.Handle(tripRequest); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment