Skip to content

Instantly share code, notes, and snippets.

@dataneek
Created April 16, 2015 03:28
Show Gist options
  • Save dataneek/63bd8c677b580820a3ac to your computer and use it in GitHub Desktop.
Save dataneek/63bd8c677b580820a3ac to your computer and use it in GitHub Desktop.
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