예제 #1
0
        /// <summary>
        /// 应用一个模块,当 A 使用 B 时, A 就是 target ,B 就是 appModule
        /// </summary>
        /// <param name="target"></param>
        /// <param name="appModule"></param>
        private void Use(IAppModule target, IAppModule appModule)
        {
            IEnumerable <AttributeAndTypeInfo> targetInfos = this.scanner.Scan(target);

            var arguments = PluginInvoker <AppModuleUsingArguments>
                            .SetArgument(new AppModuleUsingArguments(this, appModule, target, targetInfos))
                            .SetPlugins(this.Plugins)
                            .Invoke((p, args) => p.OnAppModuleBeforeUsing(this, args));

            appModule.OnUsing(arguments);

            PluginInvoker <OnAppModuleUsedArguments>
            .SetArgument(new OnAppModuleUsedArguments(appModule))
            .SetPlugins(this.Plugins)
            .Invoke((p, args) => p.OnAppModuleUsed(this, args));

            IEnumerable <IAppModule> dependentModules = appModule.DependentModules;

            if (dependentModules == null || !dependentModules.Any())
            {
                return;
            }

            foreach (IAppModule subAppModule in dependentModules)
            {
                this.Use(appModule, subAppModule);
            }
        }