public void TransientMultipleConstructorNonValueTypeTest()
		{
			DefaultKernel container = new DefaultKernel();
			container.AddComponent("FooBar", typeof(FooBarNonValue));
			Tester1 bla1 = new Tester1("FOOBAR");
			Tester2 bla2 = new Tester2(666);

			Hashtable arguments1 = new Hashtable();
			arguments1.Add("test1", bla1);

			Hashtable arguments2 = new Hashtable();
			arguments2.Add("test2", bla2);

			object a = container.Resolve(typeof(FooBarNonValue), arguments1);
			object b = container.Resolve(typeof(FooBarNonValue), arguments2);

			Assert.AreNotSame(a, b, "A should not be B");

			// multi resolve test

			a = container.Resolve(typeof(FooBarNonValue), arguments1);
			b = container.Resolve(typeof(FooBarNonValue), arguments2);

			Assert.AreNotSame(a, b, "A should not be B");
		}
		public void SimpleUsage()
		{
			IKernel kernel = new DefaultKernel();
			kernel.Register(Component.For(typeof(PoolableComponent1)).Named("a"));

			PoolableComponent1 inst1 = kernel.Resolve<PoolableComponent1>("a");
			PoolableComponent1 inst2 = kernel.Resolve<PoolableComponent1>("a");

			Assert.IsNotNull(inst1);
			Assert.IsNotNull(inst2);

			kernel.ReleaseComponent(inst2);
			kernel.ReleaseComponent(inst1);

			PoolableComponent1 other1 = kernel.Resolve<PoolableComponent1>("a");
			PoolableComponent1 other2 = kernel.Resolve<PoolableComponent1>("a");

			Assert.IsNotNull(other1);
			Assert.IsNotNull(other2);

			Assert.AreSame(inst1, other1);
			Assert.AreSame(inst2, other2);

			kernel.ReleaseComponent(inst2);
			kernel.ReleaseComponent(inst1);
		}
        public void TransientMultipleConstructorNonValueTypeTest()
        {
            DefaultKernel container = new DefaultKernel();

            ((IKernel)container).Register(Component.For(typeof(AnyClassWithReference)).Named("AnyClass"));
            Tester1 one = new Tester1("AnyString");
            Tester2 two = new Tester2(1);

            var arguments1 = new Arguments();

            arguments1.Add("test1", one);

            var arguments2 = new Arguments();

            arguments2.Add("test2", two);

            object a = container.Resolve(typeof(AnyClassWithReference), arguments1);
            object b = container.Resolve(typeof(AnyClassWithReference), arguments2);

            Assert.AreNotSame(a, b, "A should not be B");

            // multi resolve test

            a = container.Resolve(typeof(AnyClassWithReference), arguments1);
            b = container.Resolve(typeof(AnyClassWithReference), arguments2);

            Assert.AreNotSame(a, b, "A should not be B");
        }
		public void TransientMultipleConstructorNonValueTypeTest()
		{
			DefaultKernel container = new DefaultKernel();
			((IKernel)container).Register(Component.For(typeof(FooBarNonValue)).Named("FooBar"));
			Tester1 bla1 = new Tester1("FOOBAR");
			Tester2 bla2 = new Tester2(666);

			var arguments1 = new Dictionary<object, object>();
			arguments1.Add("test1", bla1);

			var arguments2 = new Dictionary<object, object>();
			arguments2.Add("test2", bla2);

			object a = container.Resolve(typeof(FooBarNonValue), arguments1);
			object b = container.Resolve(typeof(FooBarNonValue), arguments2);

			Assert.AreNotSame(a, b, "A should not be B");

			// multi resolve test

			a = container.Resolve(typeof(FooBarNonValue), arguments1);
			b = container.Resolve(typeof(FooBarNonValue), arguments2);

			Assert.AreNotSame(a, b, "A should not be B");
		}
        public void TransientMultipleConstructorNonValueTypeTest()
        {
            DefaultKernel container = new DefaultKernel();

            ((IKernel)container).Register(Component.For(typeof(FooBarNonValue)).Named("FooBar"));
            Tester1 bla1 = new Tester1("FOOBAR");
            Tester2 bla2 = new Tester2(666);

            var arguments1 = new Dictionary <object, object>();

            arguments1.Add("test1", bla1);

            var arguments2 = new Dictionary <object, object>();

            arguments2.Add("test2", bla2);

            object a = container.Resolve(typeof(FooBarNonValue), arguments1);
            object b = container.Resolve(typeof(FooBarNonValue), arguments2);

            Assert.AreNotSame(a, b, "A should not be B");

            // multi resolve test

            a = container.Resolve(typeof(FooBarNonValue), arguments1);
            b = container.Resolve(typeof(FooBarNonValue), arguments2);

            Assert.AreNotSame(a, b, "A should not be B");
        }
        public void Singleton_WithNonSingletonDependencies_DoesNotReResolveDependencies()
        {
            kernel.Register(Component.For(typeof(DefaultSpamService)).Named("spamservice"));
            kernel.Register(Component.For(typeof(DefaultMailSenderService)).Named("mailsender"));

            IKernel subkernel1 = new DefaultKernel();

            subkernel1.Register(Component.For(typeof(DefaultTemplateEngine)).Named("templateengine"));
            kernel.AddChildKernel(subkernel1);

            IKernel subkernel2 = new DefaultKernel();

            subkernel2.Register(
                Component.For(typeof(DefaultTemplateEngine)).Named("templateengine").LifeStyle.Is(LifestyleType.Transient));
            kernel.AddChildKernel(subkernel2);

            var templateengine1 = subkernel1.Resolve <DefaultTemplateEngine>("templateengine");
            var spamservice1    = subkernel1.Resolve <DefaultSpamService>("spamservice");

            Assert.IsNotNull(spamservice1);
            Assert.AreEqual(spamservice1.TemplateEngine.Key, templateengine1.Key);

            var templateengine2 = subkernel2.Resolve <DefaultTemplateEngine>("templateengine");
            var spamservice2    = subkernel2.Resolve <DefaultSpamService>("spamservice");

            Assert.IsNotNull(spamservice2);
            Assert.AreEqual(spamservice1, spamservice2);
            Assert.AreEqual(spamservice1.TemplateEngine.Key, templateengine1.Key);
            Assert.AreNotEqual(spamservice2.TemplateEngine.Key, templateengine2.Key);
        }
 public void No_context_uses_transient() {
     using (var k = new DefaultKernel()) {
         k.Register(Component.For<Dummy>().LifeStyle.HybridPerWebRequestTransient());
         var d1 = k.Resolve<Dummy>();
         Assert.IsNotNull(d1);
         var d2 = k.Resolve<Dummy>();
         Assert.IsNotNull(d2);
         Assert.AreNotSame(d1, d2);
     }
 }
 public void No_context_uses_transient()
 {
     using (var k = new DefaultKernel()) {
         k.Register(Component.For <Dummy>().LifeStyle.HybridPerWebRequestTransient());
         var d1 = k.Resolve <Dummy>();
         Assert.IsNotNull(d1);
         var d2 = k.Resolve <Dummy>();
         Assert.IsNotNull(d2);
         Assert.AreNotSame(d1, d2);
     }
 }
Example #9
0
        public void Will_give_good_error_message_if_cannot_resolve_service_that_is_likely_decorated()
        {
            DefaultKernel kernel = new DefaultKernel();
            kernel.Register(
                Component.For<IRepository>().ImplementedBy<Repository1>(),
                Component.For<IRepository>().ImplementedBy<DecoratedRepository2>()
                );
            try
            {
                kernel.Resolve<IRepository>();
            }
            catch (HandlerException e)
            {
                const string expectedMessage = @"Can't create component 'Castle.MicroKernel.Tests.ClassComponents.Repository1' as it has dependencies to be satisfied. 
Castle.MicroKernel.Tests.ClassComponents.Repository1 is waiting for the following dependencies: 

Services: 
- Castle.MicroKernel.Tests.ClassComponents.IRepository. 
  A dependency cannot be satisfied by itself, did you forget to add a parameter name to differentiate between the two dependencies? 
 
Castle.MicroKernel.Tests.ClassComponents.DecoratedRepository2 is registered and is matching the required service, but cannot be resolved.

Castle.MicroKernel.Tests.ClassComponents.DecoratedRepository2 is waiting for the following dependencies: 

Keys (components with specific keys)
- name which was not registered. 
";
                Assert.AreEqual(expectedMessage, e.Message);
            }
        }
		public void TransientMultiConstructorTest()
		{
			DefaultKernel container = new DefaultKernel();
			container.AddComponent("FooBar", typeof(FooBar));

			Hashtable arguments1 = new Hashtable();
			arguments1.Add("integer", 1);

			Hashtable arguments2 = new Hashtable();
			arguments2.Add("datetime", DateTime.Now.AddDays(1));

			object a = container.Resolve(typeof(FooBar), arguments1);
			object b = container.Resolve(typeof(FooBar), arguments2);

			Assert.AreNotSame(a, b, "A should not be B");
		}
		public void TransientMultiConstructorTest()
		{
			DefaultKernel container = new DefaultKernel();
			((IKernel)container).Register(Component.For(typeof(FooBar)).Named("FooBar"));

			var arguments1 = new Dictionary<object, object>();
			arguments1.Add("integer", 1);

			var arguments2 = new Dictionary<object, object>();
			arguments2.Add("datetime", DateTime.Now.AddDays(1));

			object a = container.Resolve(typeof(FooBar), arguments1);
			object b = container.Resolve(typeof(FooBar), arguments2);

			Assert.AreNotSame(a, b, "A should not be B");
		}
        public void PerWebRequestLifestyleManagerTest() {
            var tw = new StringWriter();
            var wr = new SimpleWorkerRequest("/", Directory.GetCurrentDirectory(), "default.aspx", null, tw);
            var module = new PerWebRequestLifestyleModule();

            var ctx = HttpModuleRunner.GetContext(wr, new[] { module });
            HttpContext.Current = ctx.Key;

            using (var kernel = new DefaultKernel()) {
                kernel.Register(Component.For<object>().LifeStyle.PerWebRequest);
                var instance1 = kernel.Resolve<object>();
                Assert.IsNotNull(instance1);
                var instance2 = kernel.Resolve<object>();
                Assert.IsNotNull(instance2);
                Assert.AreSame(instance1, instance2);
            }
        }
		public void MaxSize()
		{
			IKernel kernel = new DefaultKernel();
			kernel.Register(Component.For(typeof(PoolableComponent1)).Named("a"));

			var instances = new List<PoolableComponent1>
			{
				kernel.Resolve<PoolableComponent1>("a"),
				kernel.Resolve<PoolableComponent1>("a"),
				kernel.Resolve<PoolableComponent1>("a"),
				kernel.Resolve<PoolableComponent1>("a"),
				kernel.Resolve<PoolableComponent1>("a")
			};

			PoolableComponent1 other1 = kernel.Resolve<PoolableComponent1>("a");

			Assert.IsNotNull(other1);
			Assert.IsTrue(!instances.Contains(other1));

			foreach (PoolableComponent1 inst in instances)
			{
				kernel.ReleaseComponent(inst);
			}

			kernel.ReleaseComponent(other1);

			PoolableComponent1 other2 = kernel.Resolve<PoolableComponent1>("a");
			Assert.IsNotNull(other2);
			Assert.IsTrue(other1 != other2);
			Assert.IsTrue(instances.Contains(other2));

			kernel.ReleaseComponent(other2);
		}
		public void AddingDependencyToServiceWithCustomDependency()
		{
			var kernel = new DefaultKernel();
			kernel.Register(Component.For<NeedClassWithCustomerDependency>(),
			                Component.For<HasCustomDependency>().DependsOn(new Dictionary<object, object> { { "name", new CompA() } }));

			Assert.AreEqual(HandlerState.Valid, kernel.GetHandler(typeof(HasCustomDependency)).CurrentState);
			Assert.IsNotNull(kernel.Resolve(typeof(NeedClassWithCustomerDependency)));
		}
Example #15
0
 public void Will_give_good_error_message_if_cannot_resolve_service_that_is_likely_decorated_when_there_are_multiple_service()
 {
     DefaultKernel kernel = new DefaultKernel();
     kernel.Register(
         Component.For<IRepository>().ImplementedBy<Repository1>(),
         Component.For<IRepository>().ImplementedBy<DecoratedRepository2>().Named("foo"),
         Component.For<IRepository>().ImplementedBy<Repository1>().Named("bar")
         );
     kernel.Resolve<IRepository>();
 }
Example #16
0
 public void Should_ignore_reference_to_itself()
 {
     DefaultKernel kernel = new DefaultKernel();
     kernel.Register(
         Component.For<IRepository>().ImplementedBy<Repository1>(),
         Component.For<IRepository>().ImplementedBy<DecoratedRepository>()
         );
     Repository1 repos = (Repository1)kernel.Resolve<IRepository>();
     Assert.IsInstanceOfType(typeof(DecoratedRepository), repos.InnerRepository);
 }
        public void TransientMultiConstructorTest()
        {
            DefaultKernel container = new DefaultKernel();

            ((IKernel)container).Register(Component.For(typeof(FooBar)).Named("FooBar"));

            var arguments1 = new Dictionary <object, object>();

            arguments1.Add("integer", 1);

            var arguments2 = new Dictionary <object, object>();

            arguments2.Add("datetime", DateTime.Now.AddDays(1));

            object a = container.Resolve(typeof(FooBar), arguments1);
            object b = container.Resolve(typeof(FooBar), arguments2);

            Assert.AreNotSame(a, b, "A should not be B");
        }
        public void ChildKernelOverloadsParentKernel2()
        {
            var instance1 = new DefaultTemplateEngine();
            var instance2 = new DefaultTemplateEngine();

            IKernel subkernel = new DefaultKernel();

            kernel.AddChildKernel(subkernel);

            // subkernel added first, then populated with overloaded components after

            kernel.Register(Component.For <DefaultTemplateEngine>().Named("engine").Instance(instance2));
            Assert.AreEqual(instance2, kernel.Resolve <DefaultTemplateEngine>("engine"));
            Assert.AreEqual(instance2, subkernel.Resolve <DefaultTemplateEngine>("engine"));

            subkernel.Register(Component.For <DefaultTemplateEngine>().Named("engine").Instance(instance1));
            Assert.AreEqual(instance1, subkernel.Resolve <DefaultTemplateEngine>("engine"));
            Assert.AreEqual(instance2, kernel.Resolve <DefaultTemplateEngine>("engine"));
        }
        public void ChildKernelOverloadsParentKernel1()
        {
            var instance1 = new DefaultTemplateEngine();
            var instance2 = new DefaultTemplateEngine();

            // subkernel added with already registered components that overload parent components.

            IKernel subkernel = new DefaultKernel();

            subkernel.Register(Component.For <DefaultTemplateEngine>().Named("engine").Instance(instance1));
            Assert.AreEqual(instance1, subkernel.Resolve <DefaultTemplateEngine>("engine"));

            kernel.Register(Component.For <DefaultTemplateEngine>().Named("engine").Instance(instance2));
            Assert.AreEqual(instance2, kernel.Resolve <DefaultTemplateEngine>("engine"));

            kernel.AddChildKernel(subkernel);
            Assert.AreEqual(instance1, subkernel.Resolve <DefaultTemplateEngine>("engine"));
            Assert.AreEqual(instance2, kernel.Resolve <DefaultTemplateEngine>("engine"));
        }
Example #20
0
        public void Sub_resolver_can_provide_null_as_the_value_to_use()
        {
            IKernel kernel = new DefaultKernel();

            kernel.Resolver.AddSubResolver(new NullResolver());

            kernel.Register(Component.For <ComponentWithDependencyNotInContainer>());

            Assert.Null(kernel.Resolve <ComponentWithDependencyNotInContainer>().DependencyNotInContainer);
        }
		public void ContainerShouldUseFirstRegisteredDependencyOfTypeByDefault_SmsRegisteredFirst()
		{
			IKernel kernel = new DefaultKernel();
			kernel.Register(Component.For(typeof(IAlarmSender)).ImplementedBy(typeof(SmsSender)).Named("sms"));
			kernel.Register(Component.For(typeof(IAlarmSender)).ImplementedBy(typeof(EmailSender)).Named("email"));

			kernel.Register(Component.For(typeof(AlarmGenerator)).Named("generator"));

			var gen = kernel.Resolve<AlarmGenerator>("generator");
			Assert.AreEqual(typeof(SmsSender), gen.Sender.GetType());
		}
Example #22
0
        public void UsingPropertyWithPrivateSetter()
        {
            IKernel container = new DefaultKernel();

            container.Register(Component.For(typeof(IService1)).ImplementedBy(typeof(Service1)).Named("service1"));
            container.Register(Component.For(typeof(IService2)).ImplementedBy(typeof(Service2)).Named("service2"));

            Service2 service2 = (Service2)container.Resolve<IService2>();

            Assert.IsNull(service2.S,"Kernel should ignore private setter properties");
        }
Example #23
0
        public void UsingPropertyWithPrivateSetter()
        {
            IKernel container = new DefaultKernel();

            container.Register(Component.For(typeof(IService1)).ImplementedBy(typeof(Service1)).Named("service1"));
            container.Register(Component.For(typeof(IService2)).ImplementedBy(typeof(Service2)).Named("service2"));

            Service2 service2 = (Service2)container.Resolve <IService2>();

            Assert.IsNull(service2.S, "Kernel should ignore private setter properties");
        }
        public void ChildKernelFindsAndCreateParentComponent()
        {
            IKernel subkernel = new DefaultKernel();

            kernel.Register(Component.For(typeof(DefaultTemplateEngine)).Named("templateengine"));

            kernel.AddChildKernel(subkernel);

            Assert.IsTrue(subkernel.HasComponent(typeof(DefaultTemplateEngine)));
            Assert.IsNotNull(subkernel.Resolve <DefaultTemplateEngine>());
        }
        protected void Application_Start(object sender, EventArgs e)
        {
            var kernel = new DefaultKernel();

            kernel.Register(Component.For <HttpContextBase>()
                            .LifeStyle.Transient
                            .UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current)));
            kernel.Register(Component.For <SomeService>()
                            .LifeStyle.HybridPerWebRequestTransient());
            kernel.Resolve <SomeService>();
        }
        public void Requesting_parent_component_with_child_dependency_from_child_component()
        {
            var subkernel = new DefaultKernel();

            kernel.AddChildKernel(subkernel);

            kernel.Register(Component.For <UsesSimpleComponent1>());
            subkernel.Register(Component.For <SimpleComponent1>());

            subkernel.Resolve <UsesSimpleComponent1>();
        }
        public void UsingPropertyWithPrivateSetter()
        {
            IKernel container = new DefaultKernel();

            container.AddComponent("service1", typeof(IService1), typeof(Service1));
            container.AddComponent("service2", typeof(IService2), typeof(Service2));

            Service2 service2 = (Service2)container.Resolve<IService2>();

            Assert.IsNull(service2.S,"Kernel should ignore private setter properties");
        }
Example #28
0
        private JsUnitTestRunner CreateRunnerImpl(Configuration configuration)
        {
            settings.Add("webRootDirectory", configuration.WebRootDirectory);
            JsUnitTestRunner runner = kernel.Resolve <JsUnitTestRunner>(settings);

            if (configuration.FixtureTimeoutInSeconds > 0)
            {
                runner.FixtureTimeoutInSeconds = configuration.FixtureTimeoutInSeconds;
            }
            return(runner);
        }
        public void AddingDependencyToServiceWithCustomDependency()
        {
            var kernel = new DefaultKernel();

            kernel.Register(Component.For <NeedClassWithCustomerDependency>(),
                            Component.For <HasCustomDependency>().DependsOn(new Dictionary <object, object> {
                { "name", new CompA() }
            }));

            Assert.AreEqual(HandlerState.Valid, kernel.GetHandler(typeof(HasCustomDependency)).CurrentState);
            Assert.IsNotNull(kernel.Resolve(typeof(NeedClassWithCustomerDependency)));
        }
        public void With_context_uses_context() {
            var tw = new StringWriter();
            var wr = new SimpleWorkerRequest("/", Directory.GetCurrentDirectory(), "default.aspx", null, tw);
            var module = new PerWebRequestLifestyleModule();

            var ctx = HttpModuleRunner.GetContext(wr, new[] { module });
            HttpContext.Current = ctx.Key;

            using (var k = new DefaultKernel()) {
                k.Register(Component.For<Dummy>().LifeStyle.HybridPerWebRequestTransient());
                var d1 = k.Resolve<Dummy>();
                Assert.IsNotNull(d1);
                var d2 = k.Resolve<Dummy>();
                Assert.IsNotNull(d2);
                Assert.AreSame(d1, d2);
                ctx.Value.FireEndRequest();
                ctx.Key.Items["castle.per-web-request-lifestyle-cache"] = null;
                var d3 = k.Resolve<Dummy>();
                Assert.AreNotSame(d1, d3);
            }
        }
        public void ChildDependenciesIsSatisfiedEvenWhenComponentTakesLongToBeAddedToParentContainer()
        {
            var container      = new DefaultKernel();
            var childContainer = new DefaultKernel();

            container.AddChildKernel(childContainer);
            childContainer.Register(Component.For(typeof(UsesIEmptyService)).Named("component"));

            container.Register(
                Component.For(typeof(IEmptyService)).ImplementedBy(typeof(EmptyServiceA)).Named("service1"));

            var comp = childContainer.Resolve <UsesIEmptyService>();
        }
Example #32
0
        public void DoesNotResolveArraysByDefault()
        {
            var kernel = new DefaultKernel();

            kernel.Register(
                Component.For <Thing>(),
                Component.For <ISubThing>().ImplementedBy <First>(),
                Component.For <ISubThing>().ImplementedBy <Second>(),
                Component.For <ISubThing>().ImplementedBy <Third>()
                );

            var thing = kernel.Resolve <Thing>();
        }
        public void UseChildComponentsForParentDependenciesWhenRequestedFromChild()
        {
            IKernel subkernel = new DefaultKernel();

            kernel.Register(Component.For(typeof(DefaultSpamService)).Named("spamservice").LifeStyle.Is(LifestyleType.Transient));
            kernel.Register(Component.For(typeof(DefaultMailSenderService)).Named("mailsender"));
            kernel.Register(Component.For(typeof(DefaultTemplateEngine)).Named("templateengine"));

            kernel.AddChildKernel(subkernel);
            subkernel.Register(Component.For(typeof(DefaultTemplateEngine)).Named("templateengine"));

            var templateengine     = kernel.Resolve <DefaultTemplateEngine>("templateengine");
            var sub_templateengine = subkernel.Resolve <DefaultTemplateEngine>("templateengine");

            var spamservice = subkernel.Resolve <DefaultSpamService>("spamservice");

            Assert.AreNotEqual(spamservice.TemplateEngine, templateengine);
            Assert.AreEqual(spamservice.TemplateEngine, sub_templateengine);

            spamservice = kernel.Resolve <DefaultSpamService>("spamservice");
            Assert.AreNotEqual(spamservice.TemplateEngine, sub_templateengine);
            Assert.AreEqual(spamservice.TemplateEngine, templateengine);
        }
        public void With_context_uses_context()
        {
            var tw     = new StringWriter();
            var wr     = new SimpleWorkerRequest("/", Directory.GetCurrentDirectory(), "default.aspx", null, tw);
            var module = new PerWebRequestLifestyleModule();

            var ctx = HttpModuleRunner.GetContext(wr, new[] { module });

            HttpContext.Current = ctx.Key;

            using (var k = new DefaultKernel()) {
                k.Register(Component.For <Dummy>().LifeStyle.HybridPerWebRequestTransient());
                var d1 = k.Resolve <Dummy>();
                Assert.IsNotNull(d1);
                var d2 = k.Resolve <Dummy>();
                Assert.IsNotNull(d2);
                Assert.AreSame(d1, d2);
                ctx.Value.FireEndRequest();
                ctx.Key.Items["castle.per-web-request-lifestyle-cache"] = null;
                var d3 = k.Resolve <Dummy>();
                Assert.AreNotSame(d1, d3);
            }
        }
        public void When_attemting_to_resolve_component_with_nonpublic_ctor_should_throw_meaningfull_exception()
        {
            var kernel = new DefaultKernel();

            kernel.Register(Component.For <HasProtectedConstructor>());

            Exception exception =
                Assert.Throws <ComponentActivatorException>(() =>
                                                            kernel.Resolve <HasProtectedConstructor>());

            exception = exception.InnerException;
            Assert.IsNotNull(exception);
            StringAssert.Contains("public", exception.Message, "Exception should say that constructor has to be public.");
        }
		public void When_attemting_to_resolve_component_with_nonpublic_ctor_should_throw_meaningfull_exception()
		{
			var kernel = new DefaultKernel();

			kernel.Register(Component.For<HasProtectedConstructor>());

			Exception exception =
				Assert.Throws<ComponentActivatorException>(() => kernel.Resolve<HasProtectedConstructor>());

			exception = exception.InnerException;
			Assert.IsNotNull(exception);
			StringAssert.Contains("public", exception.Message, "Exception should say that constructor has to be public.");

		}
		public void AddingDependencyToServiceWithCustomDependency()
		{
			var k = new DefaultKernel();
			((IKernel)k).Register(Component.For(typeof(NeedClassWithCustomerDependency)).Named("NeedClassWithCustomerDependency"));
			((IKernel)k).Register(Component.For(typeof(HasCustomDependency)).Named("HasCustomDependency"));

			Assert.AreEqual(HandlerState.WaitingDependency, k.GetHandler("HasCustomDependency").CurrentState);

			var hash = new Dictionary<object, object>();
			hash["name"] = new CompA();
			k.RegisterCustomDependencies("HasCustomDependency", hash);
			Assert.AreEqual(HandlerState.Valid, k.GetHandler("HasCustomDependency").CurrentState);

			Assert.IsNotNull(k.Resolve(typeof(NeedClassWithCustomerDependency)));
		}
        public void ChildDependenciesSatisfiedAmongContainers()
        {
            IKernel subkernel = new DefaultKernel();

            kernel.Register(Component.For(typeof(DefaultTemplateEngine)).Named("templateengine"));
            kernel.Register(Component.For(typeof(DefaultMailSenderService)).Named("mailsender"));

            kernel.AddChildKernel(subkernel);
            subkernel.Register(Component.For(typeof(DefaultSpamService)).Named("spamservice"));

            var spamservice = subkernel.Resolve <DefaultSpamService>("spamservice");

            Assert.IsNotNull(spamservice);
            Assert.IsNotNull(spamservice.MailSender);
            Assert.IsNotNull(spamservice.TemplateEngine);
        }
        public void Parent_component_will_NOT_have_dependencies_from_child()
        {
            Kernel.Register(Component.For <DefaultTemplateEngine>(),
                            Component.For <DefaultSpamService>());

            var child = new DefaultKernel();

            Kernel.AddChildKernel(child);

            child.Register(Component.For <DefaultMailSenderService>());

            var spamservice = child.Resolve <DefaultSpamService>();

            Assert.IsNotNull(spamservice);
            Assert.IsNotNull(spamservice.TemplateEngine);
            Assert.IsNull(spamservice.MailSender);
        }
		public void Should_not_fail_when_constructor_parameter_and_public_property_with_private_setter_have_same_name()
		{
			IKernel kernel = new DefaultKernel();

			kernel.AddComponent<Service2>();
			kernel.AddComponent<Service1>();

			try
			{
				Service2 svc = kernel.Resolve<Service2>();
				Assert.IsNotNull(svc);
			}
			catch (NullReferenceException)
			{
				Assert.Fail("Should not have thrown a NullReferenceException");
			}
		}
Example #41
0
        public void Public_property_with_Protected_setter_causes_Object_Reference_exception()
        {
            IKernel kernel = new DefaultKernel();

            kernel.Register(Component.For <Presenter>());
            kernel.Register(Component.For <View>());

            try
            {
                Presenter p = (Presenter)kernel.Resolve(typeof(Presenter));
                Assert.IsNotNull(p);
            }
            catch (NullReferenceException)
            {
                Assert.Fail("Should not have thrown a NullReferenceException");
            }
        }
Example #42
0
        public void SetUp()
        {
            kernel = new DefaultKernel();

            kernel.AddFacility <StartableFacility>();

            kernel.Register(
                Component.For <StartableDisposableAndInitializableComponent>()
                .LifeStyle.Transient
                );

            component = kernel.Resolve <StartableDisposableAndInitializableComponent>();
            component.DoSomething();
            kernel.ReleaseComponent(component);

            calledMethods = component.calledMethods;
        }
Example #43
0
		public void Public_property_with_Protected_setter_causes_Object_Reference_exception()
		{
			IKernel kernel = new DefaultKernel();

		    kernel.Register(Component.For<Presenter>());
		    kernel.Register(Component.For<View>());

		    try
			{
				Presenter p = (Presenter)kernel.Resolve(typeof(Presenter));
				Assert.IsNotNull(p);
			}
			catch (NullReferenceException)
			{
				Assert.Fail("Should not have thrown a NullReferenceException");
			}
		}
Example #44
0
        public void Should_not_fail_when_constructor_parameter_and_public_property_with_private_setter_have_same_name()
        {
            IKernel kernel = new DefaultKernel();

            kernel.Register(Component.For <Service2>());
            kernel.Register(Component.For <Service1>());

            try
            {
                Service2 svc = kernel.Resolve <Service2>();
                Assert.IsNotNull(svc);
            }
            catch (NullReferenceException)
            {
                Assert.Fail("Should not have thrown a NullReferenceException");
            }
        }
        public void SameLevelDependenciesSatisfied()
        {
            IKernel child = new DefaultKernel();

            kernel.Register(Component.For(typeof(DefaultTemplateEngine)).Named("templateengine"));
            kernel.Register(Component.For(typeof(DefaultSpamService)).Named("spamservice"));

            kernel.AddChildKernel(child);

            child.Register(Component.For(typeof(DefaultMailSenderService)).Named("mailsender"));

            var spamservice = child.Resolve <DefaultSpamService>("spamservice");

            Assert.IsNotNull(spamservice);
            Assert.IsNotNull(spamservice.MailSender);
            Assert.IsNotNull(spamservice.TemplateEngine);
        }
		public void Will_give_good_error_message_if_cannot_resolve_service_that_is_likely_decorated()
		{
			DefaultKernel kernel = new DefaultKernel();
			kernel.Register(
				Component.For<IRepository>().ImplementedBy<Repository1>(),
				Component.For<IRepository>().ImplementedBy<DecoratedRepository2>()
				);
			var exception =
				Assert.Throws(typeof(HandlerException), () =>
				{
					kernel.Resolve<IRepository>();
				});

			string expectedMessage =
				string.Format(
					"Can't create component 'Castle.MicroKernel.Tests.ClassComponents.Repository1' as it has dependencies to be satisfied. {0}Castle.MicroKernel.Tests.ClassComponents.Repository1 is waiting for the following dependencies: {0}{0}Services: {0}- Castle.MicroKernel.Tests.ClassComponents.IRepository. {0}  A dependency cannot be satisfied by itself, did you forget to add a parameter name to differentiate between the two dependencies? {0}{0}Castle.MicroKernel.Tests.ClassComponents.DecoratedRepository2 is registered and is matching the required service, but cannot be resolved.{0}{0}Castle.MicroKernel.Tests.ClassComponents.DecoratedRepository2 is waiting for the following dependencies: {0}{0}Keys (components with specific keys){0}- name which was not registered. {0}",
					Environment.NewLine);
			Assert.AreEqual(expectedMessage, exception.Message);

		}
Example #47
0
        public void ShouldResolveArrayOfDependencies()
        {
            var kernel = new DefaultKernel();

            kernel.Resolver.AddSubResolver(new ArrayResolver(kernel));

            kernel.Register(
                Component.For <Thing>(),
                Component.For <ISubThing>().ImplementedBy <First>(),
                Component.For <ISubThing>().ImplementedBy <Second>(),
                Component.For <ISubThing>().ImplementedBy <Third>()
                );

            var thing = kernel.Resolve <Thing>();

            Assert.That(thing.SubThings.Count, Is.EqualTo(3));
            Assert.That(thing.SubThings[0], Is.InstanceOf(typeof(First)));
            Assert.That(thing.SubThings[1], Is.InstanceOf(typeof(Second)));
            Assert.That(thing.SubThings[2], Is.InstanceOf(typeof(Third)));
        }
        public void Three_level_hierarchy([Values(0, 1, 2)] int parentComponentContainer,
                                          [Values(0, 1, 2)] int childComponentContainer)
        {
            var subKernel    = new DefaultKernel();
            var subSubKernel = new DefaultKernel();

            kernel.AddChildKernel(subKernel);
            subKernel.AddChildKernel(subSubKernel);
            var containers = new[]
            {
                kernel,
                subKernel,
                subSubKernel
            };

            containers[parentComponentContainer].Register(Component.For <UsesSimpleComponent1>());
            containers[childComponentContainer].Register(Component.For <SimpleComponent1>());

            subSubKernel.Resolve <UsesSimpleComponent1>();
        }
		public void When_attemting_to_resolve_component_with_nonpublic_ctor_should_throw_meaningfull_exception()
		{
			IKernel kernel = new DefaultKernel();

			kernel.AddComponent<WithNonPublicCtor>();

			bool exceptionThrown = false;

			try
			{
				WithNonPublicCtor svc = kernel.Resolve<WithNonPublicCtor>();
				Assert.IsNotNull(svc);
			}
			catch (ComponentActivatorException exception)
			{
				ComponentActivatorException inner = exception.InnerException as ComponentActivatorException;
				Assert.IsNotNull(inner);
				StringAssert.Contains("public", inner.Message, "Exception should say that constructor has to be public.");

				exceptionThrown = true;
			}

			Assert.IsTrue(exceptionThrown, "A {0} should have been thrown.", typeof(ComponentActivatorException).Name);
		}
		public void ChildKernelOverloadsParentKernel2()
		{
			var instance1 = new DefaultTemplateEngine();
			var instance2 = new DefaultTemplateEngine();

			IKernel subkernel = new DefaultKernel();
			kernel.AddChildKernel(subkernel);

			// subkernel added first, then populated with overloaded components after

			kernel.Register(Component.For<DefaultTemplateEngine>().Named("engine").Instance(instance2));
			Assert.AreEqual(instance2, kernel.Resolve<DefaultTemplateEngine>("engine"));
			Assert.AreEqual(instance2, subkernel.Resolve<DefaultTemplateEngine>("engine"));

			subkernel.Register(Component.For<DefaultTemplateEngine>().Named("engine").Instance(instance1));
			Assert.AreEqual(instance1, subkernel.Resolve<DefaultTemplateEngine>("engine"));
			Assert.AreEqual(instance2, kernel.Resolve<DefaultTemplateEngine>("engine"));
		}
		public void DependenciesSatisfiedAmongContainersUsingEvents()
		{
			IKernel subkernel = new DefaultKernel();

			subkernel.Register(Component.For(typeof(DefaultSpamServiceWithConstructor)).Named("spamservice"));

			kernel.Register(Component.For(typeof(DefaultMailSenderService)).Named("mailsender"));
			kernel.Register(Component.For(typeof(DefaultTemplateEngine)).Named("templateengine"));

			kernel.AddChildKernel(subkernel);

			var spamservice =
				subkernel.Resolve<DefaultSpamServiceWithConstructor>("spamservice");

			Assert.IsNotNull(spamservice);
			Assert.IsNotNull(spamservice.MailSender);
			Assert.IsNotNull(spamservice.TemplateEngine);
		}
		public void Requesting_parent_component_with_child_dependency_from_child_component()
		{
			var subkernel = new DefaultKernel();
			kernel.AddChildKernel(subkernel);

			kernel.Register(Component.For<UsesSimpleComponent1>());
			subkernel.Register(Component.For<SimpleComponent1>());

			subkernel.Resolve<UsesSimpleComponent1>();
		}
		public void SameLevelDependenciesSatisfied()
		{
			IKernel child = new DefaultKernel();

			kernel.Register(Component.For(typeof(DefaultTemplateEngine)).Named("templateengine"));
			kernel.Register(Component.For(typeof(DefaultSpamService)).Named("spamservice"));

			kernel.AddChildKernel(child);

			child.Register(Component.For(typeof(DefaultMailSenderService)).Named("mailsender"));

			var spamservice = child.Resolve<DefaultSpamService>("spamservice");

			Assert.IsNotNull(spamservice);
			Assert.IsNotNull(spamservice.MailSender);
			Assert.IsNotNull(spamservice.TemplateEngine);
		}
		public void Singleton_WithNonSingletonDependencies_DoesNotReResolveDependencies()
		{
			kernel.Register(Component.For(typeof(DefaultSpamService)).Named("spamservice"));
			kernel.Register(Component.For(typeof(DefaultMailSenderService)).Named("mailsender"));

			IKernel subkernel1 = new DefaultKernel();
			subkernel1.Register(Component.For(typeof(DefaultTemplateEngine)).Named("templateengine"));
			kernel.AddChildKernel(subkernel1);

			IKernel subkernel2 = new DefaultKernel();
			subkernel2.Register(
				Component.For(typeof(DefaultTemplateEngine)).Named("templateengine").LifeStyle.Is(LifestyleType.Transient));
			kernel.AddChildKernel(subkernel2);

			var templateengine1 = subkernel1.Resolve<DefaultTemplateEngine>("templateengine");
			var spamservice1 = subkernel1.Resolve<DefaultSpamService>("spamservice");
			Assert.IsNotNull(spamservice1);
			Assert.AreEqual(spamservice1.TemplateEngine.Key, templateengine1.Key);

			var templateengine2 = subkernel2.Resolve<DefaultTemplateEngine>("templateengine");
			var spamservice2 = subkernel2.Resolve<DefaultSpamService>("spamservice");
			Assert.IsNotNull(spamservice2);
			Assert.AreEqual(spamservice1, spamservice2);
			Assert.AreEqual(spamservice1.TemplateEngine.Key, templateengine1.Key);
			Assert.AreNotEqual(spamservice2.TemplateEngine.Key, templateengine2.Key);
		}
		public void Three_level_hierarchy([Values(0, 1, 2)] int parentComponentContainer,
		                                  [Values(0, 1, 2)] int childComponentContainer)
		{
			var subKernel = new DefaultKernel();
			var subSubKernel = new DefaultKernel();
			kernel.AddChildKernel(subKernel);
			subKernel.AddChildKernel(subSubKernel);
			var containers = new[]
			{
				kernel,
				subKernel,
				subSubKernel
			};

			containers[parentComponentContainer].Register(Component.For<UsesSimpleComponent1>());
			containers[childComponentContainer].Register(Component.For<SimpleComponent1>());

			subSubKernel.Resolve<UsesSimpleComponent1>();
		}
		public void UseChildComponentsForParentDependenciesWhenRequestedFromChild()
		{
			IKernel subkernel = new DefaultKernel();

			kernel.Register(Component.For(typeof(DefaultSpamService)).Named("spamservice").LifeStyle.Is(LifestyleType.Transient));
			kernel.Register(Component.For(typeof(DefaultMailSenderService)).Named("mailsender"));
			kernel.Register(Component.For(typeof(DefaultTemplateEngine)).Named("templateengine"));

			kernel.AddChildKernel(subkernel);
			subkernel.Register(Component.For(typeof(DefaultTemplateEngine)).Named("templateengine"));

			var templateengine = kernel.Resolve<DefaultTemplateEngine>("templateengine");
			var sub_templateengine = subkernel.Resolve<DefaultTemplateEngine>("templateengine");

			var spamservice = subkernel.Resolve<DefaultSpamService>("spamservice");
			Assert.AreNotEqual(spamservice.TemplateEngine, templateengine);
			Assert.AreEqual(spamservice.TemplateEngine, sub_templateengine);

			spamservice = kernel.Resolve<DefaultSpamService>("spamservice");
			Assert.AreNotEqual(spamservice.TemplateEngine, sub_templateengine);
			Assert.AreEqual(spamservice.TemplateEngine, templateengine);
		}
		public void MultiThreaded_RemoveResolve_Throws_When_LargeRatio_Of_ComponentsToService()
		{
			var threadCount = 1000;
			var list = new List<Exception>();
			var locker = new object();
			var rand = new Random();
			var waitEvent = new ManualResetEvent(false);

			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new KeySearchNamingSubSystem(delegate { return false; }));

			kernel.Register(Component.For(typeof(ICommon)).ImplementedBy(typeof(CommonImpl1)).Named("common"));

			WaitCallback resolveThread = delegate
			{
				waitEvent.WaitOne();
				while (threadCount > 0 && list.Count == 0)
				{
					try
					{
						kernel.Resolve<ICommon>();
					}
					catch (Exception e)
					{
						lock (locker)
						{
							list.Add(e);
						}
					}
				}
			};
			ThreadPool.QueueUserWorkItem(resolveThread);

			WaitCallback removeThread = delegate
			{
				waitEvent.WaitOne();
				kernel.RemoveComponent(threadCount + ".common");
				Interlocked.Decrement(ref threadCount);
			};
			for (var i = 0; i < threadCount; i++)
			{
				kernel.Register(Component.For(typeof(ICommon)).ImplementedBy(typeof(CommonImpl1)).Named(i + ".common"));
				ThreadPool.QueueUserWorkItem(removeThread);
			}

			waitEvent.Set();
			while (threadCount > 0 && list.Count == 0)
			{
				Thread.Sleep(15);
			}

			if (list.Count > 0)
			{
				throw list[0];
			}
		}