示例#1
0
        /// <summary>
        ///     配置完成。
        /// </summary>
        public void Done()
        {
            if (_assemblies.IsNull())
            {
                return;
            }

            if (_assemblies.Count == 0)
            {
                this.LoadAssemblies();

                if (LogManager.Default.IsDebugEnabled)
                {
                    LogManager.Default.DebugFormat("load assemblies completed. [{0}]",
                                                   string.Join("; ", _assemblies.Select(assembly => assembly.FullName)));
                }
            }

            var allTypes         = _assemblies.SelectMany(assembly => assembly.GetTypes()).ToArray();
            var nonAbstractTypes = allTypes.Where(type => type.IsClass && !type.IsAbstract).ToArray();

            BasicTypes.CommandTypes = nonAbstractTypes.Where(typeof(ICommand).IsAssignableFrom)
                                      .ToDictionary(type => type.Name, type => type);
            BasicTypes.EventTypes = nonAbstractTypes.Where(typeof(IEvent).IsAssignableFrom)
                                    .ToDictionary(type => type.Name, type => type);
            BasicTypes.AggregateTypes = nonAbstractTypes.Where(typeof(IAggregateRoot).IsAssignableFrom)
                                        .ToDictionary(type => type.Name, type => type);
            BasicTypes.PublishableExceptionTypes = nonAbstractTypes.Where(typeof(IPublishableException).IsAssignableFrom)
                                                   .ToDictionary(type => type.Name, type => type);
            BasicTypes.QueryTypes = nonAbstractTypes.Where(typeof(IQuery).IsAssignableFrom)
                                    .ToDictionary(type => type.Name, type => type);

            RegisterComponents(nonAbstractTypes);
            RegisterDefaultComponents();
            RegisterHandler(nonAbstractTypes);

            _container.Complete();

            _container.RegisteredTypes.Where(component => component.InitializationRequired)
            .Select(component => _container.Resolve(component.Type, component.Name))
            .OfType <IInitializer>()
            .Distinct()
            .ForEach(initializer => initializer.Initialize(_container, allTypes));


            _assemblies.Clear();
            _assemblies = null;

            Start();

            _stopwatch.Stop();

            LogManager.Default.InfoFormat("system is working, used time:{0}ms.", _stopwatch.ElapsedMilliseconds);

            _stopwatch = null;
        }