Ejemplo n.º 1
0
 public PropertiesInjector(ILibraryAsPropertiesLoader loader, string info)
 {
     Loader = loader;
     Info   = info;
 }
Ejemplo n.º 2
0
        public AspNetHostEngine(
            List <System.Reflection.Assembly> assembliesForAttaching,
            List <PropertiesInjectorInfo> propertiesInjectorsInfo,
            System.Collections.Hashtable commonModulesForLoading
            )
        {
            System.Collections.Specialized.NameValueCollection appSettings = System.Web.Configuration.WebConfigurationManager.AppSettings;

            _hostedScript = new HostedScriptEngine();

            // метод настраивает внутренние переменные у SystemGlobalContext
            if (appSettings["enableEcho"] == "true")
            {
                _hostedScript.SetGlobalEnvironment(new ASPNetApplicationHost(), new AspEntryScriptSrc(appSettings["startupScript"] ?? HttpContext.Current.Server.MapPath("~/web.config")));
            }
            else
            {
                _hostedScript.SetGlobalEnvironment(new AspNetNullApplicationHost(), new AspNetNullEntryScriptSrc());
            }

            _hostedScript.Initialize();

            // Размещаем oscript.cfg вместе с web.config. Так наверное привычнее
            _hostedScript.CustomConfig = appSettings["configFilePath"] ?? System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "oscript.cfg");

            // Аттачим доп сборки. По идее должны лежать в Bin
            foreach (System.Reflection.Assembly assembly in assembliesForAttaching)
            {
                _hostedScript.AttachAssembly(assembly);
            }

            // Добавляем свойства для общих модулей
            foreach (System.Collections.DictionaryEntry cm in commonModulesForLoading)
            {
                _hostedScript.InjectGlobalProperty((string)cm.Key, ValueFactory.Create(), true);
            }

            // Загружаем классы инжекторов свойств
            List <PropertiesInjector> propertiesInjectors = new List <PropertiesInjector>();

            foreach (PropertiesInjectorInfo ci in propertiesInjectorsInfo)
            {
                ILibraryAsPropertiesLoader instance = (ILibraryAsPropertiesLoader)(Activator.CreateInstance(ci.AssemblyName, ci.ClassName).Unwrap());
                propertiesInjectors.Add(new PropertiesInjector(instance, ci.Info));
            }

            // Получаем и вставляем списки свойств. Класс инжектора должен иметь метод GetPropertyNamesForInjecting
            foreach (PropertiesInjector injector in propertiesInjectors)
            {
                List <string> propertiesNames = injector.Loader.GetPropertiesNamesForInjecting(injector.Info);
                foreach (string cp in propertiesNames)
                {
                    _hostedScript.InjectGlobalProperty(cp, ValueFactory.Create(), true);
                }
            }

            // Подключаем общие модули
            foreach (System.Collections.DictionaryEntry cm in commonModulesForLoading)
            {
                ICodeSource src = _hostedScript.Loader.FromString((string)cm.Value);

                var compilerService = _hostedScript.GetCompilerService();
                var module          = compilerService.CreateModule(src);
                var loaded          = _hostedScript.EngineInstance.LoadModuleImage(module);
                var instance        = (IValue)_hostedScript.EngineInstance.NewObject(loaded);
                _hostedScript.EngineInstance.Environment.SetGlobalProperty((string)cm.Key, instance);
            }

            // Присваиваем значения свойств
            foreach (PropertiesInjector injector in propertiesInjectors)
            {
                injector.Loader.AssignPropertiesValues(_hostedScript);
            }

            _hostedScript.EngineInstance.Environment.LoadMemory(MachineInstance.Current);
        }