/// <summary>
        /// Gets an instance of a <see cref="IJavaScriptModule"/>.
        /// </summary>
        /// <typeparam name="T">Type of JavaScript module.</typeparam>
        /// <param name="instance">The React instance.</param>
        /// <returns>The JavaScript module instance.</returns>
        public T GetJavaScriptModule <T>(IReactInstance instance) where T : IJavaScriptModule, new()
        {
            lock (_moduleInstances)
            {
                if (!_moduleInstances.TryGetValue(typeof(T), out var moduleInstance))
                {
                    var type = typeof(T);
                    moduleInstance = new T();
                    var invokeHandler = new JavaScriptModuleInvocationHandler(instance, type.Name);
                    moduleInstance.InvocationHandler = invokeHandler;
                    _moduleInstances.Add(type, moduleInstance);
                }

                return((T)moduleInstance);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Gets an instance of a <see cref="IJavaScriptModule"/>.
        /// </summary>
        /// <typeparam name="T">Type of JavaScript module.</typeparam>
        /// <param name="instance">The React instance.</param>
        /// <returns>The JavaScript module instance.</returns>
        public T GetJavaScriptModule <T>(IReactInstance instance) where T : IJavaScriptModule
        {
            lock (_moduleInstances)
            {
                var moduleInstance = default(IJavaScriptModule);
                if (!_moduleInstances.TryGetValue(typeof(T), out moduleInstance))
                {
                    var registration = default(JavaScriptModuleRegistration);
                    if (!_moduleRegistrations.TryGetValue(typeof(T), out registration))
                    {
                        throw new InvalidOperationException(
                                  Invariant($"JS module '{typeof(T)}' hasn't been registered."));
                    }

                    var type = registration.ModuleInterface;
                    moduleInstance = (IJavaScriptModule)Activator.CreateInstance(type);
                    var invokeHandler = new JavaScriptModuleInvocationHandler(instance, registration);
                    moduleInstance.InvocationHandler = invokeHandler;
                    _moduleInstances.Add(type, moduleInstance);
                }

                return((T)moduleInstance);
            }
        }