Пример #1
0
        public void ConfigureServices(IDependencyContainer container)
        {
            container.AddSingleton <ITaskScheduler, DefaultTaskScheduler>();
            container.AddTransient <IConfiguration, YamlConfiguration>("yaml", null);
            container.AddTransient <IConfiguration, JsonConfiguration>("json");
            container.AddTransient <IConfiguration, XmlConfiguration>("xml");

            container.AddSingleton <IRocketConfigurationProvider, RocketConfigurationProvider>();

            container.AddSingleton <ILogger, ConsoleLogger>("console_logger");
            container.AddSingleton <ILogger, LoggerProxy>("proxy_logger", null);

            container.AddSingleton <IEventBus, EventBus>();

            container.AddSingleton <ICommandHandler, DefaultCommandHandler>("default_cmdhandler");
            container.AddSingleton <ICommandHandler, CommandHandlerProxy>("proxy_cmdhandler", null);

            container.AddSingleton <IPluginLoader, DefaultClrPluginLoader>("dll_plugins");
            container.AddSingleton <IPluginLoader, NuGetPluginLoader>("nuget_plugins");
            container.AddSingleton <IPluginLoader, PluginLoaderProxy>("proxy_plugins", null);

            container.AddSingleton <ICommandProvider, RocketCommandProvider>("rocket_cmdprovider");
            container.AddSingleton <ICommandProvider, CommandProviderProxy>("proxy_cmdprovider", null);

            var configPermissions = container.Activate <ConfigurationPermissionProvider>();

            container.AddTransient <IPermissionProvider>(configPermissions, "default_permissions", null);
            container.AddTransient <IPermissionChecker>(configPermissions, "default_permissions");

            container.AddSingleton <IPermissionChecker, ConsolePermissionChecker>("console_checker");
            container.AddSingleton <IPermissionChecker, PermissionProviderProxy>("proxy_checker", null);

            container.AddTransient <ITranslationCollection, TranslationCollection>();
            container.AddSingleton <IUserManager, UserManagerProxy>();
        }
Пример #2
0
        protected virtual IPlugin LoadPluginFromAssembly(Assembly pluginAssembly, out IDependencyContainer pluginContainer)
        {
            pluginContainer = null;

            string loc = GetAssemblyLocationSafe(pluginAssembly);

            if (!string.IsNullOrEmpty(loc) &&
                !cachedAssemblies.ContainsKey(loc))
            {
                cachedAssemblies.Add(loc, pluginAssembly);
            }

            Type[] types;
            try
            {
                types = pluginAssembly.GetTypes();
            }
            catch (ReflectionTypeLoadException e)
            {
                types = e.Types;
            }

            Type pluginType = null;

            foreach (Type type in types.Where(t => t != null))
            {
                if (type.IsAbstract || type.IsInterface)
                {
                    continue;
                }

                if (type.GetCustomAttributes(typeof(DontAutoRegisterAttribute), true).Any())
                {
                    continue;
                }

                if (pluginType == null && typeof(IPlugin) != type && typeof(IPlugin).IsAssignableFrom(type))
                {
                    pluginType = type;
                }
            }

            if (pluginType == null)
            {
                return(null);
            }

            pluginContainer = Container.CreateChildContainer();
            pluginContainer.AddTransient <IPluginLoader>(this);

            IPlugin pluginInstance = (IPlugin)pluginContainer.Activate(pluginType);

            if (pluginInstance == null)
            {
                throw new Exception("Failed to activate: " + pluginType.FullName + ". Is your plugin constructor public?");
            }

            Container.AddTransient(pluginInstance, pluginInstance.Name);

            pluginContainer.AddTransient(pluginInstance);

            IEnumerable <Type> pluginCommands =
                pluginInstance.FindTypes <ICommand>(false, c => !typeof(IChildCommand).IsAssignableFrom(c) &&
                                                    c.GetCustomAttributes(typeof(DontAutoRegisterAttribute), true).Length == 0);
            IEnumerable <Type> dependencyRegistrators = pluginInstance.FindTypes <IServiceConfigurator>(false);

            foreach (Type registrator in dependencyRegistrators)
            {
                ((IServiceConfigurator)Activator.CreateInstance(registrator)).ConfigureServices(Container);
            }

            foreach (Type command in pluginCommands)
            {
                try
                {
                    ICommand cmdInstance = (ICommand)pluginContainer.Activate(command);
                    if (cmdInstance != null)
                    {
                        pluginContainer.AddSingleton(cmdInstance, cmdInstance.Name);
                    }
                }
                catch (Exception ex)
                {
                    Logger.LogError(null, ex);
                }
            }

            return(pluginInstance);
        }