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);
            }
        }
 public DependencyContainer(DependencyContainer innerContainer,
                            IDependencyContainerConfigurator configurator)
     : this(innerContainer.locator, innerContainer.policies, innerContainer.strategies, configurator)
 {
 }
 public DependencyContainer(IDependencyContainerConfigurator configurator)
     : this(null, null, null, configurator)
 {
 }