using System.Collections.Generic;
public static void Main()
Console.WriteLine("Setup the container");
Container container = new Container();
container.Register<Hotel>();
container.Register<IRoomAllocator, LeastRecentlyUsedRoomManager>();
container.Collection.Register<Room>(new List<Room> {
new Room(1, new DateTime(2021, 10, 20), true),
new Room(2, new DateTime(2021, 10, 22), false),
new Room(3, new DateTime(2021, 10, 21), false),
Console.WriteLine("Run the system");
var hotel = container.GetInstance<Hotel>();
private IRoomAllocator roomAllocator;
private IPaymentCalculator paymentCalculator;
public Hotel(IRoomAllocator roomAllocator, IEnumerable<Room> rooms) {
this.roomAllocator = roomAllocator;
private IEnumerable<Room> rooms;
Console.WriteLine("Start booking a room");
return roomAllocator.GetFreeRoom(rooms);
public interface IRoomAllocator
Room GetFreeRoom(IEnumerable<Room> rooms);
public interface IPaymentCalculator
public int Number { get; private set; }
public DateTime LastUsedAt { get; set; }
public bool Booked { get; set; }
public Room(int number, DateTime lastUsedAt, bool booked)
public class LeastRecentlyUsedRoomManager : IRoomAllocator
public Room GetFreeRoom(IEnumerable<Room> rooms)
var room = rooms.OrderBy(r => r.LastUsedAt).First();
public class NearestFrontDeskRoom : IRoomAllocator
public Room GetFreeRoom(IEnumerable<Room> rooms)
var room = rooms.OrderBy(r => r.Number).First(r => (r.Booked != true));