Ejemplo n.º 1
0
        /// <summary>
        /// Adds a dynamic dotNetify view model.
        /// </summary>
        /// <param name="app">Application builder.</param>
        /// <param name="vmName">View model name.</param>
        /// <param name="propertyBuilder">Delegate that returns an object for building the view model's properties.</param>
        private static IApplicationBuilder MapVM <T>(this IApplicationBuilder app, string vmName, Delegate propertyBuilder) where T : BaseVM, new()
        {
            vmName          = !string.IsNullOrWhiteSpace(vmName) ? vmName : throw new ArgumentNullException(nameof(vmName));
            propertyBuilder = propertyBuilder ?? throw new ArgumentNullException(nameof(propertyBuilder));

            // Make sure "UseDotNetify()" is called first.
            if (!_useDotNetify)
            {
                app.UseWebSockets();
                app.UseDotNetify(config => config.UseFilter <AuthorizeFilter>());
            }

            VMController.Register(vmName, _ =>
            {
                using (var scope = app.ApplicationServices.CreateScope())
                {
                    var args = new List <object>();
                    foreach (var parameter in propertyBuilder.Method.GetParameters())
                    {
                        var instance = scope.ServiceProvider.GetRequiredService(parameter.ParameterType);
                        args.Add(instance);
                    }

                    var propertySource = propertyBuilder.DynamicInvoke(args.ToArray());
                    if (propertySource is Task)
                    {
                        var resultProperty = propertySource.GetType().GetProperty("Result");
                        propertySource     = resultProperty.GetValue(propertySource);
                    }

                    return(VMBuilder.Build <T>(propertySource, propertyBuilder.Method.GetCustomAttributes()));
                }
            });

            return(app);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Register a specific view model class type.
 /// </summary>
 public IDotNetifyConfiguration Register <T>() where T : INotifyPropertyChanged
 {
     VMController.Register <T>();
     return(this);
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Register a specific runtime view model class type.
 /// </summary>
 public IDotNetifyConfiguration Register(string typeName, Func <object[], INotifyPropertyChanged> factory)
 {
     VMController.Register(typeName, factory);
     return(this);
 }