示例#1
0
        public void TransactionAspect_ShouldSpecializeTheTransactionManager()
        {
            var mockModule = new Mock <IModule>(MockBehavior.Strict);

            using (IServiceContainer container = new ServiceContainer())
            {
                container.Factory(injector => mockModule.Object, Lifetime.Scoped);

                IInjector injector = container.CreateInjector();
                IModule   module   = injector.Get <IModule>();

                Assert.That(module, Is.InstanceOf <TransactionManager <IModule> >());
            }
        }
示例#2
0
        public void OwnedServiceInstantiationStrategy_ShouldUseTheExistingInjector()
        {
            using (IServiceContainer container = new ServiceContainer())
            {
                container.Service <IService, Service>(Lifetime.Transient);

                IInjector injector = container.CreateInjector();

                injector.Get <IService>();

                AbstractServiceEntry entry = injector.UnderlyingContainer.Get <IService>();

                Assert.That(entry.Instances.Single().RelatedInjector, Is.EqualTo(injector));
                Assert.That(entry.Instances.Single().RelatedInjector.UnderlyingContainer, Is.EqualTo(entry.Owner));
            }
        }
示例#3
0
        public void NotOwnedServiceInstantiationStrategy_ShouldInstantiateWithANewInjector()
        {
            using (IServiceContainer container = new ServiceContainer())
            {
                container.Service <IService, Service>(Lifetime.Singleton);

                IInjector injector = container.CreateInjector();

                injector.Get <IService>();

                AbstractServiceEntry entry = injector.UnderlyingContainer.Get <IService>();

                Assert.That(entry.Instances.Single().RelatedInjector, Is.Not.EqualTo(injector));
                Assert.That(entry.Instances.Single().RelatedInjector.UnderlyingContainer.Parent, Is.EqualTo(entry.Owner));
            }
        }
示例#4
0
        public void NotOwnedServiceInstantiationStrategy_ShouldLock()
        {
            using (IServiceContainer container = new ServiceContainer())
            {
                container.Factory <IService>(i =>
                {
                    Assert.That(Monitor.IsEntered(container.Get <IService>()));
                    return(new Service());
                }, Lifetime.Singleton);

                container.CreateInjector().Get <IService>();

                Assert.That(container.Get <IService>().Instances, Is.Not.Null); // factory hivva volt
                Assert.That(Monitor.IsEntered(container.Get <IService>()), Is.False);
            }
        }
示例#5
0
文件: Graph.cs 项目: Sholtee/injector
        public void DotGraphTest()
        {
            using IServiceContainer container = new ServiceContainer();

            container
            .Service <IInterface_1, Implementation_1>(Lifetime.Transient)
            .Service <IInterface_2, Implementation_2>(Lifetime.Singleton)
            .Service <IInterface_3, Implementation_3>(Lifetime.Transient)
            .Service <IInterface_4, Implementation_4>(Lifetime.Scoped);

            using IInjector injector = container.CreateInjector();

            string
                dotGraph = injector.GetDependencyGraph <IInterface_4>(),
                id1      = ContainsNode("<<u>Solti.Utils.DI.Injector.Graph.Tests.GraphTests.IInterface_4</u><br/><br/><i>Scoped</i>>"),
                id2      = ContainsNode("<<u>Solti.Utils.DI.Interfaces.IInjector</u><br/><br/><i>Instance</i>>"),
                id3      = ContainsNode("<<u>Solti.Utils.DI.Injector.Graph.Tests.GraphTests.IInterface_2</u><br/><br/><i>Singleton</i>>"),
                id4      = ContainsNode("<<u>Solti.Utils.DI.Injector.Graph.Tests.GraphTests.IInterface_1</u><br/><br/><i>Transient</i>>"),
                id5      = ContainsNode("<<u>System.Collections.Generic.IReadOnlyDictionary{string, object}:$options</u><br/><br/><i>Instance</i>>"),
                id6      = ContainsNode("<<u>Solti.Utils.DI.Injector.Graph.Tests.GraphTests.IInterface_3</u><br/><br/><i>Transient</i>>");

            ContainsEdge(id1, id2);
            ContainsEdge(id1, id3);
            ContainsEdge(id3, id4);
            ContainsEdge(id4, id5);
            ContainsEdge(id1, id6);
            ContainsEdge(id6, id5);
            ContainsEdge(id6, id4);
            ContainsEdge(id6, id3);

            string ContainsNode(string str)
            {
                str = Regex.Replace(str, "\\.|\\/|\\$", match => $"\\{match.Value}");

                Match match = Regex.Match(dotGraph, $"  (?<id>N_[0-9A-F]{{8}}) \\[shape=box,margin=\\.1,label={str}\\];", RegexOptions.Multiline);

                Assert.That(match.Captures, Has.Count.EqualTo(1));

                return(match.Groups["id"].Value);
            }

            void ContainsEdge(string id1, string id2)
            {
                Assert.That(Regex.Match(dotGraph, $"{id1} -> {id2}", RegexOptions.Multiline).Captures, Has.Count.EqualTo(1));
            }
        }
示例#6
0
文件: Graph.cs 项目: Sholtee/injector
        public void ComplexTest()
        {
            IServiceReference[] references;

            using (IServiceContainer container = new ServiceContainer())
            {
                container
                .Service <IInterface_1, Implementation_1>(Lifetime.Transient)
                .Service <IInterface_2, Implementation_2>(Lifetime.Singleton)
                .Service <IInterface_3, Implementation_3>(Lifetime.Transient)
                .Service <IInterface_4, Implementation_4>(Lifetime.Scoped);

                references = Validate(container.CreateInjector());
            }

            Assert.That(references.All(reference => reference.RefCount == 0));
        }