/// <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; }