Log On

The LightCore IoC container 1.4

I have looked at the LightCore IoC container before in this post. Now Peter Bucher has released version 1.4.1 of LightCore.

I'm happy to say that this fixes the issue that I had with version 1.0 and things work smoothly.

The updated test suite code is below and will be on GitHub

namespace IoCComparison
{
    using LightCore;
    using LightCore.Lifecycle;
    using NUnit.Framework;

    [TestFixture]
    public class LightcoreTest
    {
        [Test]
        public void CanMakeSweetShopWithVanillaJellybeans()
        {
            var builder = new ContainerBuilder();
            builder.Register<IJellybeanDispenser, VanillaJellybeanDispenser>();
            builder.Register<SweetVendingMachine>();
            builder.Register<SweetShop>();

            IContainer container = builder.Build();
            SweetShop sweetShop = container.Resolve<SweetShop>();

            Assert.AreEqual(Jellybean.Vanilla, sweetShop.DispenseJellyBean());
        }

        [Test]
        public void CanMakeSweetShopWithVanillaJellybeansSweetshopNotRegistered()
        {
            var builder = new ContainerBuilder();
            builder.Register<IJellybeanDispenser, VanillaJellybeanDispenser>();
            builder.Register<SweetVendingMachine>();

            IContainer container = builder.Build();
            SweetShop sweetShop = container.Resolve<SweetShop>();

            Assert.AreEqual(Jellybean.Vanilla, sweetShop.DispenseJellyBean());
        }

        [Test]
        public void CanMakeSweetShopWithStrawberryJellybeans()
        {
            var builder = new ContainerBuilder();
            builder.Register<IJellybeanDispenser, StrawberryJellybeanDispenser>();
            builder.Register<SweetVendingMachine>();
            builder.Register<SweetShop>();

            IContainer container = builder.Build();
            SweetShop sweetShop = container.Resolve<SweetShop>();

            Assert.AreEqual(Jellybean.Strawberry, sweetShop.DispenseJellyBean());
        }

        [Test]
        public void ByDefaultAllObjectsHaveNewInstanceEachTime()
        {
            var builder = new ContainerBuilder();
            builder.Register<IJellybeanDispenser, VanillaJellybeanDispenser>();
            builder.Register<SweetVendingMachine>();
            builder.Register<SweetShop>();

            IContainer container = builder.Build();
            SweetShop sweetShop = container.Resolve<SweetShop>();
            SweetShop sweetShop2 = container.Resolve<SweetShop>();

            Assert.IsFalse(ReferenceEquals(sweetShop, sweetShop2), "Root objects are equal");
            Assert.IsFalse(ReferenceEquals(sweetShop.SweetVendingMachine, sweetShop2.SweetVendingMachine), "Contained objects are equal");
            Assert.IsFalse(ReferenceEquals(sweetShop.SweetVendingMachine.JellybeanDispenser, sweetShop2.SweetVendingMachine.JellybeanDispenser), "services are equal");
        }

        [Test]
        public void TopLevelObjectCanBeSingletonWithControlledBy()
        {
            var builder = new ContainerBuilder();
            builder.Register<IJellybeanDispenser, VanillaJellybeanDispenser>();
            builder.Register<SweetVendingMachine>();
            builder.Register<SweetShop>().ControlledBy<SingletonLifecycle>();

            IContainer container = builder.Build();
            SweetShop sweetShop = container.Resolve<SweetShop>();
            SweetShop sweetShop2 = container.Resolve<SweetShop>();

            Assert.IsTrue(ReferenceEquals(sweetShop, sweetShop2), "Root objects are equal");
        }

        [Test]
        public void BuilderDefaultControlledBySetsAllObjectsToSingleton()
        {
            var builder = new ContainerBuilder();
            builder.DefaultControlledBy<SingletonLifecycle>(); // do this before the register
            builder.Register<IJellybeanDispenser, VanillaJellybeanDispenser>();
            builder.Register<SweetVendingMachine>();
            builder.Register<SweetShop>();

            IContainer container = builder.Build();
            SweetShop sweetShop = container.Resolve<SweetShop>();
            SweetShop sweetShop2 = container.Resolve<SweetShop>();

            Assert.IsTrue(ReferenceEquals(sweetShop, sweetShop2), "Root objects are equal");
            Assert.IsTrue(ReferenceEquals(sweetShop.SweetVendingMachine, sweetShop2.SweetVendingMachine), "Contained objects are equal");
            Assert.IsTrue(ReferenceEquals(sweetShop.SweetVendingMachine.JellybeanDispenser, sweetShop2.SweetVendingMachine.JellybeanDispenser), "JellybeanDispenser are equal");
        }

        [Test]
        public void CanMakeSingletonJellybeanDispenser()
        {
            var builder = new ContainerBuilder();
            builder.Register<IJellybeanDispenser, VanillaJellybeanDispenser>()
                .ControlledBy<SingletonLifecycle>(); // is the default
            builder.Register<SweetVendingMachine>()
                .ControlledBy<TransientLifecycle>();
            builder.Register<SweetShop>();

            IContainer container = builder.Build();
            SweetShop sweetShop = container.Resolve<SweetShop>();
            SweetShop sweetShop2 = container.Resolve<SweetShop>();

            Assert.IsFalse(ReferenceEquals(sweetShop, sweetShop2), "Root objects are equal");
            Assert.IsFalse(ReferenceEquals(sweetShop.SweetVendingMachine, sweetShop2.SweetVendingMachine), "Contained objects are equal");

            // should be same service
            Assert.IsTrue(ReferenceEquals(sweetShop.SweetVendingMachine.JellybeanDispenser, sweetShop2.SweetVendingMachine.JellybeanDispenser), "services are not equal");
        }

        [Test]
        public void CanMakeAniseedRootObject()
        {
            var builder = new ContainerBuilder();
            builder.Register<SweetShop, AniseedSweetShop>();

            IContainer container = builder.Build();
            SweetShop sweetShop = container.Resolve<SweetShop>();

            Assert.AreEqual(Jellybean.Aniseed, sweetShop.DispenseJellyBean());
        }

        [Test]
        public void CanUseAnyJellybeanDispenser()
        {
            var builder = new ContainerBuilder();
            builder.Register<IJellybeanDispenser, AnyJellybeanDispenser>().WithArguments(Jellybean.Lemon);
            builder.Register<SweetVendingMachine>();
            builder.Register<SweetShop>();

            IContainer container = builder.Build();
            SweetShop sweetShop = container.Resolve<SweetShop>();

            Assert.AreEqual(Jellybean.Lemon, sweetShop.DispenseJellyBean());
        }

        [Test]
        public void CanUseConstructedObject()
        {
            var builder = new ContainerBuilder();
            IJellybeanDispenser instance = new AnyJellybeanDispenser(Jellybean.Cocoa);

            // use a lambda to register the instance
            builder.Register(c => instance);
            builder.Register<SweetVendingMachine>();
            builder.Register<SweetShop>();

            IContainer container = builder.Build();
            SweetShop sweetShop = container.Resolve<SweetShop>();

            Assert.AreEqual(Jellybean.Cocoa, sweetShop.DispenseJellyBean());
        }

        [Test]
        public void CanUseObjectFactory()
        {
            var builder = new ContainerBuilder();
            builder.Register<IJellybeanDispenser>(c => new AnyJellybeanDispenser(Jellybean.Orange));
            builder.Register<SweetVendingMachine>();
            builder.Register<SweetShop>();

            IContainer container = builder.Build();
            SweetShop sweetShop = container.Resolve<SweetShop>();

            Assert.AreEqual(Jellybean.Orange, sweetShop.DispenseJellyBean());
        }
    }
}

Tags: DependencyInjection, DI, IoC, InversionOfControl, C#, dotNet, code, container, lightcore

Add a Comment