コード例 #1
0
ファイル: Implementation.cs プロジェクト: xibeiwind/container
            // Root Container Constructor
            internal ContainerContext(UnityContainer container, StagedStrategyChain <Pipeline, Stage> type,
                                      StagedStrategyChain <Pipeline, Stage> factory,
                                      StagedStrategyChain <Pipeline, Stage> instance)
            {
                // Container this context represents
                Container = container;

                // Lifetime Managers
                _typeLifetimeManager     = TransientLifetimeManager.Instance;
                _factoryLifetimeManager  = TransientLifetimeManager.Instance;
                _instanceLifetimeManager = new ContainerControlledLifetimeManager();

                // Initialize Pipelines
                TypePipeline              = type;
                TypePipeline.Invalidated += (s, e) => TypePipelineCache = TypePipeline.ToArray();
                TypePipelineCache         = TypePipeline.ToArray();

                FactoryPipeline              = factory;
                FactoryPipeline.Invalidated += (s, e) => FactoryPipelineCache = FactoryPipeline.ToArray();
                FactoryPipelineCache         = FactoryPipeline.ToArray();

                InstancePipeline              = instance;
                InstancePipeline.Invalidated += (s, e) => InstancePipelineCache = InstancePipeline.ToArray();
                InstancePipelineCache         = InstancePipeline.ToArray();
            }
コード例 #2
0
        public void OrderingAcrossStagesForStrategyChain()
        {
            StagedStrategyChain <BuilderStrategy, FakeStage> innerChain = new StagedStrategyChain <BuilderStrategy, FakeStage>();
            StagedStrategyChain <BuilderStrategy, FakeStage> outerChain = new StagedStrategyChain <BuilderStrategy, FakeStage>(innerChain);
            FakeStrategy innerStage1 = new FakeStrategy {
                Name = "innerStage1"
            };
            FakeStrategy innerStage2 = new FakeStrategy {
                Name = "innerStage2"
            };
            FakeStrategy outerStage1 = new FakeStrategy {
                Name = "outerStage1"
            };
            FakeStrategy outerStage2 = new FakeStrategy {
                Name = "outerStage2"
            };

            innerChain.Add(innerStage1, FakeStage.Stage1);
            innerChain.Add(innerStage2, FakeStage.Stage2);
            outerChain.Add(outerStage1, FakeStage.Stage1);
            outerChain.Add(outerStage2, FakeStage.Stage2);

            var chain = outerChain.ToArray();

            AssertOrder(chain, innerStage1, outerStage1, innerStage2, outerStage2);
        }
コード例 #3
0
 public void SetUp()
 {
     builder    = new Builder();
     strategies = new StagedStrategyChain <BuilderStage>();
     strategies.AddNew <ConfigurationNameMappingStrategy>(BuilderStage.PreCreation);
     MockNameMapper.invoked = false;
 }
コード例 #4
0
        /// <summary>
        /// Create a default <see cref="UnityContainer"/>.
        /// </summary>
        public UnityContainer()
        {
            // Root of the hierarchy
            _root = this;

            // Lifetime Container
            LifetimeContainer = new LifetimeContainer(this);

            // Registry
            InitializeRootRegistry();

            /////////////////////////////////////////////////////////////

            // Context
            _context = new ContainerContext(this);

            // Build Strategies
            _strategies = new StagedStrategyChain <BuilderStrategy, UnityBuildStage>
            {
                { new LifetimeStrategy(), UnityBuildStage.Lifetime },             // Lifetime
                { new BuildKeyMappingStrategy(), UnityBuildStage.TypeMapping },   // Mapping
                { new BuildPlanStrategy(), UnityBuildStage.Creation }             // Build
            };

            // Update on change
            _strategies.Invalidated += (s, e) => _strategiesChain = _strategies.ToArray();
            _strategiesChain         = _strategies.ToArray();


            // Default Policies and Strategies
            SetDefaultPolicies(this);
        }
コード例 #5
0
ファイル: Implementation.cs プロジェクト: elkadeem/container
            // Child Container Constructor
            internal ContainerContext(UnityContainer container)
            {
                // Container this context represents
                Container = container;

                var parent = Container._parent ?? throw new InvalidOperationException("Parent must not be null");

                // Lifetime Managers
                _typeLifetimeManager     = parent.Context._typeLifetimeManager;
                _factoryLifetimeManager  = parent.Context._factoryLifetimeManager;
                _instanceLifetimeManager = parent.Context._instanceLifetimeManager;

                // TODO: Create on demand

                // Initialize Pipelines
                TypePipeline              = new StagedStrategyChain <Pipeline, Stage>(parent.Context.TypePipeline);
                TypePipeline.Invalidated += (s, e) => TypePipelineCache = TypePipeline.ToArray();
                TypePipelineCache         = TypePipeline.ToArray();

                FactoryPipeline              = new StagedStrategyChain <Pipeline, Stage>(parent.Context.FactoryPipeline);
                FactoryPipeline.Invalidated += (s, e) => FactoryPipelineCache = FactoryPipeline.ToArray();
                FactoryPipelineCache         = FactoryPipeline.ToArray();

                InstancePipeline              = new StagedStrategyChain <Pipeline, Stage>(parent.Context.InstancePipeline);
                InstancePipeline.Invalidated += (s, e) => InstancePipelineCache = InstancePipeline.ToArray();
                InstancePipelineCache         = InstancePipeline.ToArray();
            }
コード例 #6
0
        /// <summary>
        /// Create a <see cref="Unity.UnityContainer"/> with the given parent container.
        /// </summary>
        /// <param name="parent">The parent <see cref="Unity.UnityContainer"/>. The current object
        /// will apply its own settings first, and then check the parent for additional ones.</param>
        private UnityContainer(UnityContainer parent)
        {
            // WithLifetime
            LifetimeContainer = new LifetimeContainer(this);

            // Context and policies
            _context = new ContainerContext(this);

            // Parent
            _parent = parent ?? throw new ArgumentNullException(nameof(parent));
            _parent.LifetimeContainer.Add(this);
            _root = _parent._root;
            SetDefaultPolicies = parent.SetDefaultPolicies;

            // Methods
            _get = _parent._get;
            _getGenericRegistration    = _parent._getGenericRegistration;
            _isExplicitlyRegistered    = _parent._isExplicitlyRegistered;
            IsTypeExplicitlyRegistered = _parent.IsTypeExplicitlyRegistered;

            GetRegistration = _parent.GetRegistration;
            Register        = CreateAndSetOrUpdate;
            GetPolicy       = parent.GetPolicy;
            SetPolicy       = CreateAndSetPolicy;
            ClearPolicy     = delegate { };

            // Strategies
            _strategies              = _parent._strategies;
            _strategiesChain         = _parent._strategiesChain;
            _strategies.Invalidated += OnStrategiesChanged;

            // Caches
            SetDefaultPolicies(this);
        }
コード例 #7
0
        /// <summary>
        /// Create a <see cref="Unity.UnityContainer"/> with the given parent container.
        /// </summary>
        /// <param name="parent">The parent <see cref="Unity.UnityContainer"/>. The current object
        /// will apply its own settings first, and then check the parent for additional ones.</param>
        private UnityContainer(UnityContainer parent)
        {
            // Parent
            _parent = parent ?? throw new ArgumentNullException(nameof(parent));
            _parent.LifetimeContainer.Add(this);

            // Root of the hierarchy
            _root = _parent._root;

            // Lifetime
            LifetimeContainer = new LifetimeContainer(this);

            // Registry
            Register = InitAndAdd;

            /////////////////////////////////////////////////////////////

            SetDefaultPolicies = parent.SetDefaultPolicies;

            // Context and policies
            _context = new ContainerContext(this);

            // Strategies
            _strategies              = _parent._strategies;
            _strategiesChain         = _parent._strategiesChain;
            _strategies.Invalidated += (s, e) => _strategiesChain = _strategies.ToArray();

            // Caches
            SetDefaultPolicies(this);
        }
コード例 #8
0
        /// <summary>
        /// Create a <see cref="Unity.UnityContainer"/> with the given parent container.
        /// </summary>
        /// <param name="parent">The parent <see cref="Unity.UnityContainer"/>. The current object
        /// will apply its own settings first, and then check the parent for additional ones.</param>
        private UnityContainer(UnityContainer parent)
        {
            // Parent
            _parent = parent;
            _parent?._lifetimeContainer.Add(this);

            // Strategies
            _strategies          = new StagedStrategyChain <IBuilderStrategy, UnityBuildStage>(_parent?._strategies);
            _buildPlanStrategies = new StagedStrategyChain <IBuilderStrategy, BuilderStage>(_parent?._buildPlanStrategies);

            // Lifetime
            _lifetimeContainer = new LifetimeContainer(this)
            {
                _strategies, _buildPlanStrategies
            };

            // Default Policies
            if (null == _parent)
            {
                InitializeRootContainer();
            }
            _defaultPolicies = parent?._defaultPolicies ?? GetDefaultPolicies();
            this[null, null] = _defaultPolicies;

            // Context and policies
            _extensions = new List <UnityContainerExtension>();
            _context    = new ContainerContext(this);

            // Caches
            OnStrategiesChanged(this, null);
            _strategies.Invalidated += OnStrategiesChanged;
        }
コード例 #9
0
        private MockBuilderContext GetContext()
        {
            StagedStrategyChain <BuilderStage> chain = new StagedStrategyChain <BuilderStage>();

            chain.AddNew <DynamicMethodCallStrategy>(BuilderStage.Initialization);

            DynamicMethodBuildPlanCreatorPolicy policy =
                new DynamicMethodBuildPlanCreatorPolicy(chain);

            MockBuilderContext context = new MockBuilderContext();

            context.Strategies.Add(new LifetimeStrategy());

            // Not used in Win8
            //context.PersistentPolicies.SetDefault<IDynamicBuilderMethodCreatorPolicy>(
            //    DynamicBuilderMethodCreatorFactory.CreatePolicy());
            context.PersistentPolicies.SetDefault <IConstructorSelectorPolicy>(
                new ConstructorSelectorPolicy <InjectionConstructorAttribute>());
            context.PersistentPolicies.SetDefault <IPropertySelectorPolicy>(
                new PropertySelectorPolicy <DependencyAttribute>());
            context.PersistentPolicies.SetDefault <IMethodSelectorPolicy>(
                new MethodSelectorPolicy <InjectionMethodAttribute>());

            context.PersistentPolicies.SetDefault <IBuildPlanCreatorPolicy>(policy);

            return(context);
        }
コード例 #10
0
        public static TestingBuilderContext GetFullContext()
        {
            TestingBuilderContext context = new TestingBuilderContext();

            context.Strategies.Add(new BuildKeyMappingStrategy());
            context.Strategies.Add(new LifetimeStrategy());
            context.Strategies.Add(new BuildPlanStrategy());

            StagedStrategyChain <BuilderStage> buildPlanChain =
                new StagedStrategyChain <BuilderStage>();

            buildPlanChain.AddNew <DynamicMethodConstructorStrategy>(BuilderStage.Creation);
            buildPlanChain.AddNew <DynamicMethodPropertySetterStrategy>(BuilderStage.Initialization);
            buildPlanChain.AddNew <DynamicMethodCallStrategy>(BuilderStage.Initialization);

            DynamicMethodBuildPlanCreatorPolicy creatorPolicy =
                new DynamicMethodBuildPlanCreatorPolicy(buildPlanChain);

            context.PersistentPolicies.SetDefault <IDynamicBuilderMethodCreatorPolicy>(
                new DefaultDynamicBuilderMethodCreatorPolicy());
            context.PersistentPolicies.SetDefault <IBuildPlanCreatorPolicy>(creatorPolicy);
            context.PersistentPolicies.SetDefault <IConstructorSelectorPolicy>(
                new ConstructorSelectorPolicy <InjectionConstructorAttribute>());
            context.PersistentPolicies.SetDefault <IPropertySelectorPolicy>(
                new PropertySelectorPolicy <DependencyAttribute>());
            context.PersistentPolicies.SetDefault <IMethodSelectorPolicy>(
                new MethodSelectorPolicy <InjectionMethodAttribute>());

            return(context);
        }
コード例 #11
0
        /// <summary>
        /// Create a default <see cref="UnityContainer"/>.
        /// </summary>
        public UnityContainer()
        {
            _root = this;

            // WithLifetime
            LifetimeContainer = new LifetimeContainer(this);

            // Registrations
            _registrations = new Registrations(ContainerInitialCapacity);

            // Context
            _context = new ContainerContext(this);

            // Methods
            _get = Get;
            _getGenericRegistration    = GetOrAddGeneric;
            _isExplicitlyRegistered    = IsExplicitlyRegisteredLocally;
            IsTypeExplicitlyRegistered = IsTypeTypeExplicitlyRegisteredLocally;

            GetRegistration = GetOrAdd;
            Register        = AddOrUpdate;
            GetPolicy       = Get;
            SetPolicy       = Set;
            ClearPolicy     = Clear;

            // Build Strategies
            _strategies = new StagedStrategyChain <BuilderStrategy, UnityBuildStage>
            {
                {   // Array
                    new ArrayResolveStrategy(
                        typeof(UnityContainer).GetTypeInfo().GetDeclaredMethod(nameof(ResolveArray)),
                        typeof(UnityContainer).GetTypeInfo().GetDeclaredMethod(nameof(ResolveGenericArray))),
                    UnityBuildStage.Enumerable
                },
                {   // Enumerable
                    new EnumerableResolveStrategy(
                        typeof(UnityContainer).GetTypeInfo().GetDeclaredMethod(nameof(ResolveEnumerable)),
                        typeof(UnityContainer).GetTypeInfo().GetDeclaredMethod(nameof(ResolveGenericEnumerable))),
                    UnityBuildStage.Enumerable
                },
                { new BuildKeyMappingStrategy(), UnityBuildStage.TypeMapping },   // Mapping
                { new LifetimeStrategy(), UnityBuildStage.Lifetime },             // WithLifetime
                { new BuildPlanStrategy(), UnityBuildStage.Creation }             // Build
            };

            // Update on change
            _strategies.Invalidated += OnStrategiesChanged;
            _strategiesChain         = _strategies.ToArray();


            // Default Policies and Strategies
            SetDefaultPolicies(this);

            Set(typeof(Func <>), All, typeof(LifetimeManager), new PerResolveLifetimeManager());
            Set(typeof(Func <>), All, typeof(ResolveDelegateFactory), (ResolveDelegateFactory)DeferredFuncResolverFactory.DeferredResolveDelegateFactory);
            Set(typeof(Lazy <>), All, typeof(ResolveDelegateFactory), (ResolveDelegateFactory)GenericLazyResolverFactory.GetResolver);

            // Register this instance
            ((IUnityContainer)this).RegisterInstance(typeof(IUnityContainer), null, this, new ContainerLifetimeManager());
        }
コード例 #12
0
        protected virtual IStrategyChain CreateStrategyChain()
        {
            StagedStrategyChain <BuilderStage> strategies = new StagedStrategyChain <BuilderStage>();

            Strategies.ForEach(item => strategies.Add(CreateStrategy(item.Type), item.Stage));

            return(strategies.MakeStrategyChain());
        }
コード例 #13
0
 public void TestDeepProfilingExtensionWithEmptyFilter()
 {
     var strategies = new StagedStrategyChain<UnityBuildStage>();
     var mockContext = new Mock<ExtensionContext>();
     mockContext.Setup(c => c.Strategies).Returns(strategies);
     var target = new DeepProfilingExtension(null);
     target.InitializeExtension(mockContext.Object);
     Assert.AreEqual(0, strategies.MakeStrategyChain().Count());
 }
コード例 #14
0
        static EnterpriseLibraryFactory()
        {
            builder = new Builder();
            StagedStrategyChain <BuilderStage> stagedStrategyChain = new StagedStrategyChain <BuilderStage>();

            stagedStrategyChain.AddNew <ConfigurationNameMappingStrategy>(BuilderStage.PreCreation);
            stagedStrategyChain.AddNew <LocatorLookupStrategy>(BuilderStage.PreCreation);
            stagedStrategyChain.AddNew <ConfiguredObjectStrategy>(BuilderStage.PreCreation);
            stagedStrategyChain.AddNew <InstrumentationStrategy>(BuilderStage.PostInitialization);
            strategyChain = stagedStrategyChain.MakeStrategyChain();
        }
コード例 #15
0
        private void InitializeBuilderState()
        {
            registeredNames = new NamedTypesRegistry(ParentNameRegistry);
            extensions      = new List <UnityContainerExtension>();

            locator             = new Locator(ParentLocator);
            lifetimeContainer   = new LifetimeContainer();
            strategies          = new StagedStrategyChain <UnityBuildStage>(ParentStrategies);
            buildPlanStrategies = new StagedStrategyChain <UnityBuildStage>(ParentBuildPlanStrategies);
            policies            = new PolicyList(ParentPolicies);
        }
コード例 #16
0
        public void SetUp()
        {
            baseStrategyChain = new StagedStrategyChain <BuilderStage>();

            baseStrategyChain.AddNew <PolicyInjectionStrategy>(BuilderStage.PreCreation);
            baseStrategyChain.AddNew <BuildKeyMappingStrategy>(BuilderStage.PreCreation);
            baseStrategyChain.AddNew <BuildPlanStrategy>(BuilderStage.Creation);

            buildPlanStrategyChain = new StagedStrategyChain <BuilderStage>();
            buildPlanStrategyChain.AddNew <DynamicMethodConstructorStrategy>(BuilderStage.Creation);
            buildPlanStrategyChain.AddNew <DynamicMethodPropertySetterStrategy>(BuilderStage.Initialization);
        }
		public void SetUp()
		{
			baseStrategyChain = new StagedStrategyChain<BuilderStage>();

			baseStrategyChain.AddNew<PolicyInjectionStrategy>(BuilderStage.PreCreation);
			baseStrategyChain.AddNew<BuildKeyMappingStrategy>(BuilderStage.PreCreation);
			baseStrategyChain.AddNew<BuildPlanStrategy>(BuilderStage.Creation);

            buildPlanStrategyChain = new StagedStrategyChain<BuilderStage>();
            buildPlanStrategyChain.AddNew<DynamicMethodConstructorStrategy>(BuilderStage.Creation);
            buildPlanStrategyChain.AddNew<DynamicMethodPropertySetterStrategy>(BuilderStage.Initialization);
		}
コード例 #18
0
        public void InnerStrategiesComeBeforeOuterStrategiesInStrategyChain()
        {
            StagedStrategyChain<FakeStage> innerChain = new StagedStrategyChain<FakeStage>();
            StagedStrategyChain<FakeStage> outerChain = new StagedStrategyChain<FakeStage>(innerChain);
            FakeStrategy innerStrategy = new FakeStrategy();
            FakeStrategy outerStrategy = new FakeStrategy();
            innerChain.Add(innerStrategy, FakeStage.Stage1);
            outerChain.Add(outerStrategy, FakeStage.Stage1);

            IStrategyChain chain = outerChain.MakeStrategyChain();

            AssertOrder(chain, innerStrategy, outerStrategy);
        }
コード例 #19
0
        public void InnerStrategiesComeBeforeOuterStrategiesInStrategyChain()
        {
            StagedStrategyChain <FakeStage> innerChain = new StagedStrategyChain <FakeStage>();
            StagedStrategyChain <FakeStage> outerChain = new StagedStrategyChain <FakeStage>(innerChain);
            FakeStrategy innerStrategy = new FakeStrategy();
            FakeStrategy outerStrategy = new FakeStrategy();

            innerChain.Add(innerStrategy, FakeStage.Stage1);
            outerChain.Add(outerStrategy, FakeStage.Stage1);

            IStrategyChain chain = outerChain.MakeStrategyChain();

            AssertOrder(chain, innerStrategy, outerStrategy);
        }
コード例 #20
0
ファイル: UnityContainer.cs プロジェクト: CoreCompat/unity
        private void InitializeBuilderState()
        {
            registeredNames = new NamedTypesRegistry(ParentNameRegistry);
            extensions      = new List <UnityContainerExtension>();

            lifetimeContainer   = new LifetimeContainer();
            strategies          = new StagedStrategyChain <UnityBuildStage>(ParentStrategies);
            buildPlanStrategies = new StagedStrategyChain <UnityBuildStage>(ParentBuildPlanStrategies);
            policies            = new PolicyList(ParentPolicies);
            policies.Set <IRegisteredNamesPolicy>(new RegisteredNamesPolicy(registeredNames), null);

            cachedStrategies     = null;
            cachedStrategiesLock = new object();
        }
コード例 #21
0
        public void InitializeAddsReleasingStrategyToContext()
        {
            // Fixture setup
            var strategies = new StagedStrategyChain<UnityBuildStage>();

            var contextStub = new Mock<ExtensionContext> { CallBase = true };
            contextStub.SetupGet(ctx => ctx.Strategies).Returns(strategies);

            var sut = new CacheLifetimeStrategyExtension();
            // Exercise system
            sut.InitializeExtension(contextStub.Object);
            // Verify outcome
            Assert.True(strategies.MakeStrategyChain().OfType<CacheReleasingLifetimeStrategy>().Any());
            // Teardown
        }
コード例 #22
0
        public void OrderingAcrossStagesForStrategyChain()
        {
            StagedStrategyChain<FakeStage> innerChain = new StagedStrategyChain<FakeStage>();
            StagedStrategyChain<FakeStage> outerChain = new StagedStrategyChain<FakeStage>(innerChain);
            FakeStrategy innerStage1 = new FakeStrategy();
            FakeStrategy innerStage2 = new FakeStrategy();
            FakeStrategy outerStage1 = new FakeStrategy();
            FakeStrategy outerStage2 = new FakeStrategy();
            innerChain.Add(innerStage1, FakeStage.Stage1);
            innerChain.Add(innerStage2, FakeStage.Stage2);
            outerChain.Add(outerStage1, FakeStage.Stage1);
            outerChain.Add(outerStage2, FakeStage.Stage2);

            IStrategyChain chain = outerChain.MakeStrategyChain();

            AssertOrder(chain, innerStage1, outerStage1, innerStage2, outerStage2);
        }
コード例 #23
0
        public void MultipleChildContainers()
        {
            StagedStrategyChain<FakeStage> innerChain = new StagedStrategyChain<FakeStage>();
            StagedStrategyChain<FakeStage> outerChain = new StagedStrategyChain<FakeStage>(innerChain);
            StagedStrategyChain<FakeStage> superChain = new StagedStrategyChain<FakeStage>(outerChain);

            FakeStrategy innerStrategy = new FakeStrategy();
            FakeStrategy outerStrategy = new FakeStrategy();
            FakeStrategy superStrategy = new FakeStrategy();
            innerChain.Add(innerStrategy, FakeStage.Stage1);
            outerChain.Add(outerStrategy, FakeStage.Stage1);
            superChain.Add(superStrategy, FakeStage.Stage1);

            IStrategyChain chain = superChain.MakeStrategyChain();

            AssertOrder(chain, innerStrategy, outerStrategy, superStrategy);
        }
コード例 #24
0
        private static MockBuilderContext GetContext()
        {
            var chain = new StagedStrategyChain<BuilderStage>();
            chain.AddNew<DynamicMethodConstructorStrategy>(BuilderStage.Creation);

            var policy = new DynamicMethodBuildPlanCreatorPolicy(chain);

            var context = new MockBuilderContext();

            context.Strategies.Add(new LifetimeStrategy());

            context.PersistentPolicies.SetDefault<IConstructorSelectorPolicy>(
                new ConstructorSelectorPolicy<InjectionConstructorAttribute>());
            context.PersistentPolicies.SetDefault<IBuildPlanCreatorPolicy>(policy);

            return context;
        }
コード例 #25
0
        DependencyContainer(IReadableLocator innerLocator,
                            IPolicyList innerPolicies,
                            StagedStrategyChain <BuilderStage> innerStrategies,
                            IDependencyContainerConfigurator configurator)
        {
            locator    = new Locator(innerLocator);
            policies   = new PolicyList(innerPolicies);
            strategies = new StagedStrategyChain <BuilderStage>(innerStrategies);

            RegisterSingletonInstance <IObjectFactory>(this);

            if (innerStrategies == null)
            {
                strategies.AddNew <BuildKeyMappingStrategy>(BuilderStage.PreCreation);
                strategies.AddNew <SingletonStrategy>(BuilderStage.PreCreation);
                strategies.AddNew <ConstructorReflectionStrategy>(BuilderStage.PreCreation);
                strategies.AddNew <MethodReflectionStrategy>(BuilderStage.PreCreation);
                strategies.AddNew <PropertyReflectionStrategy>(BuilderStage.PreCreation);
                strategies.AddNew <EventBrokerReflectionStrategy>(BuilderStage.PreCreation);
                strategies.AddNew <InterceptionReflectionStrategy>(BuilderStage.PreCreation);

                strategies.AddNew <InterfaceInterceptionStrategy>(BuilderStage.Creation);
                strategies.AddNew <VirtualInterceptionStrategy>(BuilderStage.Creation);
                strategies.AddNew <CreationStrategy>(BuilderStage.Creation);

                strategies.AddNew <PropertySetterStrategy>(BuilderStage.Initialization);
                strategies.AddNew <MethodCallStrategy>(BuilderStage.Initialization);
                strategies.AddNew <EventBrokerStrategy>(BuilderStage.Initialization);

                strategies.AddNew <BuilderAwareStrategy>(BuilderStage.PostInitialization);
                strategies.AddNew <RemotingInterceptionStrategy>(BuilderStage.PostInitialization);
            }

            if (innerPolicies == null)
            {
                policies.SetDefault <ICreationPolicy>(new DefaultCreationPolicy());
            }

            locator.Add(typeof(EventBrokerService), new EventBrokerService());

            if (configurator != null)
            {
                configurator.Configure(this);
            }
        }
コード例 #26
0
        public void OrderingAcrossStagesForStrategyChain()
        {
            StagedStrategyChain <FakeStage> innerChain = new StagedStrategyChain <FakeStage>();
            StagedStrategyChain <FakeStage> outerChain = new StagedStrategyChain <FakeStage>(innerChain);
            FakeStrategy innerStage1 = new FakeStrategy();
            FakeStrategy innerStage2 = new FakeStrategy();
            FakeStrategy outerStage1 = new FakeStrategy();
            FakeStrategy outerStage2 = new FakeStrategy();

            innerChain.Add(innerStage1, FakeStage.Stage1);
            innerChain.Add(innerStage2, FakeStage.Stage2);
            outerChain.Add(outerStage1, FakeStage.Stage1);
            outerChain.Add(outerStage2, FakeStage.Stage2);

            IStrategyChain chain = outerChain.MakeStrategyChain();

            AssertOrder(chain, innerStage1, outerStage1, innerStage2, outerStage2);
        }
コード例 #27
0
        public void MultipleChildContainers()
        {
            StagedStrategyChain <FakeStage> innerChain = new StagedStrategyChain <FakeStage>();
            StagedStrategyChain <FakeStage> outerChain = new StagedStrategyChain <FakeStage>(innerChain);
            StagedStrategyChain <FakeStage> superChain = new StagedStrategyChain <FakeStage>(outerChain);

            FakeStrategy innerStrategy = new FakeStrategy();
            FakeStrategy outerStrategy = new FakeStrategy();
            FakeStrategy superStrategy = new FakeStrategy();

            innerChain.Add(innerStrategy, FakeStage.Stage1);
            outerChain.Add(outerStrategy, FakeStage.Stage1);
            superChain.Add(superStrategy, FakeStage.Stage1);

            IStrategyChain chain = superChain.MakeStrategyChain();

            AssertOrder(chain, innerStrategy, outerStrategy, superStrategy);
        }
コード例 #28
0
        private static MockBuilderContext GetContext()
        {
            var chain = new StagedStrategyChain <IBuilderStrategy, BuilderStage>();

            chain.Add(new DynamicMethodConstructorStrategy(), BuilderStage.Creation);

            var policy = new DynamicMethodBuildPlanCreatorPolicy(chain);

            var context = new MockBuilderContext();

            context.Strategies.Add(new LifetimeStrategy());

            context.PersistentPolicies.SetDefault <IConstructorSelectorPolicy>(
                new ConstructorSelectorPolicy <InjectionConstructorAttribute>());
            context.PersistentPolicies.SetDefault <IBuildPlanCreatorPolicy>(policy);

            return(context);
        }
コード例 #29
0
        public void InitializeAddsReleasingStrategyToContext()
        {
            // Fixture setup
            var strategies = new StagedStrategyChain <UnityBuildStage>();

            var contextStub = new Mock <ExtensionContext> {
                CallBase = true
            };

            contextStub.SetupGet(ctx => ctx.Strategies).Returns(strategies);

            var sut = new CacheLifetimeStrategyExtension();

            // Exercise system
            sut.InitializeExtension(contextStub.Object);
            // Verify outcome
            Assert.True(strategies.MakeStrategyChain().OfType <CacheReleasingLifetimeStrategy>().Any());
            // Teardown
        }
コード例 #30
0
        /// <summary>
        /// Create a <see cref="Unity.UnityContainer"/> with the given parent container.
        /// </summary>
        /// <param name="parent">The parent <see cref="Unity.UnityContainer"/>. The current object
        /// will apply its own settings first, and then check the parent for additional ones.</param>
        private UnityContainer(UnityContainer parent)
        {
            _parent = parent;
            _parent?._lifetimeContainer.Add(this);
            _context = new ContainerContext(this);

            _extensions = new List<UnityContainerExtension>();
            _strategies = new StagedStrategyChain<IBuilderStrategy, UnityBuildStage>(_parent?._strategies);
            _buildPlanStrategies = new StagedStrategyChain<IBuilderStrategy, BuilderStage>(_parent?._buildPlanStrategies);
            _lifetimeContainer = new LifetimeContainer { _strategies, _buildPlanStrategies };


            if (null == _parent)
                InitializeStrategies();
            else
                this[null, null] = _parent[null, null];

            RegisterInstance(typeof(IUnityContainer), null, this, new ContainerLifetimeManager());
        }
コード例 #31
0
        private TestingBuilderContext GetContext()
        {
            StagedStrategyChain <BuilderStage> chain = new StagedStrategyChain <BuilderStage>();

            chain.AddNew <DynamicMethodConstructorStrategy>(BuilderStage.Creation);

            DynamicMethodBuildPlanCreatorPolicy policy =
                new DynamicMethodBuildPlanCreatorPolicy(chain);

            TestingBuilderContext context = new TestingBuilderContext();

            context.Strategies.Add(new SingletonStrategy());

            context.PersistentPolicies.SetDefault <IConstructorSelectorPolicy>(
                new ConstructorSelectorPolicy <InjectionConstructorAttribute>());

            context.PersistentPolicies.SetDefault <IBuildPlanCreatorPolicy>(policy);

            return(context);
        }
コード例 #32
0
        private MockBuilderContext GetContext()
        {
            StagedStrategyChain <BuilderStage> chain = new StagedStrategyChain <BuilderStage>();

            chain.AddNew <DynamicMethodPropertySetterStrategy>(BuilderStage.Initialization);

            DynamicMethodBuildPlanCreatorPolicy policy =
                new DynamicMethodBuildPlanCreatorPolicy(chain);

            MockBuilderContext context = new MockBuilderContext();

            context.Strategies.Add(new LifetimeStrategy());

            context.Policies.SetDefault <IConstructorSelectorPolicy>(
                new ConstructorSelectorPolicy <InjectionConstructorAttribute>());
            context.Policies.SetDefault <IPropertySelectorPolicy>(
                new PropertySelectorPolicy <DependencyAttribute>());
            context.Policies.SetDefault <IBuildPlanCreatorPolicy>(policy);

            return(context);
        }
コード例 #33
0
        private MockBuilderContext GetContext()
        {
            StagedStrategyChain <BuilderStage> chain = new StagedStrategyChain <BuilderStage>();

            chain.AddNew <DynamicMethodConstructorStrategy>(BuilderStage.Creation);

            DynamicMethodBuildPlanCreatorPolicy policy =
                new DynamicMethodBuildPlanCreatorPolicy(chain);

            MockBuilderContext context = new MockBuilderContext();

            context.Strategies.Add(new LifetimeStrategy());

            context.PersistentPolicies.SetDefault <IConstructorSelectorPolicy>(
                new ConstructorSelectorPolicy <InjectionConstructorAttribute>());
            context.PersistentPolicies.SetDefault <IDynamicBuilderMethodCreatorPolicy>(
                DynamicBuilderMethodCreatorFactory.CreatePolicy());
            context.PersistentPolicies.SetDefault <IBuildPlanCreatorPolicy>(policy);

            return(context);
        }
コード例 #34
0
        public void MultipleChildContainers()
        {
            StagedStrategyChain <BuilderStrategy, FakeStage> innerChain = new StagedStrategyChain <BuilderStrategy, FakeStage>();
            StagedStrategyChain <BuilderStrategy, FakeStage> outerChain = new StagedStrategyChain <BuilderStrategy, FakeStage>(innerChain);
            StagedStrategyChain <BuilderStrategy, FakeStage> superChain = new StagedStrategyChain <BuilderStrategy, FakeStage>(outerChain);

            FakeStrategy innerStrategy = new FakeStrategy {
                Name = "innerStrategy"
            };
            FakeStrategy outerStrategy = new FakeStrategy {
                Name = "outerStrategy"
            };
            FakeStrategy superStrategy = new FakeStrategy {
                Name = "superStrategy"
            };

            innerChain.Add(innerStrategy, FakeStage.Stage1);
            outerChain.Add(outerStrategy, FakeStage.Stage1);
            superChain.Add(superStrategy, FakeStage.Stage1);

            var chain = superChain.ToArray();

            AssertOrder(chain, innerStrategy, outerStrategy, superStrategy);
        }
コード例 #35
0
ファイル: UnityContainer.cs プロジェクト: shhyder/application
        private void InitializeBuilderState()
        {
            registeredNames = new NamedTypesRegistry(ParentNameRegistry);
            extensions = new List<UnityContainerExtension>();

            locator = new Locator(ParentLocator);
            lifetimeContainer = new LifetimeContainer();
            strategies = new StagedStrategyChain<UnityBuildStage>(ParentStrategies);
            buildPlanStrategies = new StagedStrategyChain<UnityBuildStage>(ParentBuildPlanStrategies);
            policies = new PolicyList(ParentPolicies);

            cachedStrategies = null;
            cachedStrategiesLock = new object();
        }