Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement