/// <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); }
/// <summary> /// Register a specific view model class type. /// </summary> public IDotNetifyConfiguration Register <T>() where T : INotifyPropertyChanged { VMController.Register <T>(); return(this); }
/// <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); }