DatabaseConfigPageFactory.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System;
  2. using System.Reflection;
  3. using System.Windows;
  4. using TeamAAS.Database.Attributes;
  5. using TeamAAS.Database.Services;
  6. namespace TeamAAS.Database.UI
  7. {
  8. /// <summary>
  9. /// 配置页工厂(对齐 CameraDebugPageFactory):按数据库提供者上的 [DatabaseProvider] 特性选择配置页类型,
  10. /// 未指定 <see cref="DatabaseProviderAttribute.ConfigPageType"/> 时回退默认页 <see cref="DefaultDatabaseConfigPage"/>;
  11. /// 创建成功后自动把产品数据库实例绑定给实现了 <see cref="IDatabaseConfigPage"/> 的页面。
  12. /// </summary>
  13. public static class DatabaseConfigPageFactory
  14. {
  15. /// <summary>为指定产品数据库创建配置/调试页(FrameworkElement,可直接塞进 ContentControl)。</summary>
  16. public static FrameworkElement Create(ProductDatabase database)
  17. {
  18. Type pageType = typeof(DefaultDatabaseConfigPage);
  19. if (database?.Database != null)
  20. {
  21. var attr = database.Database.GetType()
  22. .GetCustomAttribute<DatabaseProviderAttribute>(inherit: false);
  23. if (attr?.ConfigPageType != null &&
  24. typeof(FrameworkElement).IsAssignableFrom(attr.ConfigPageType))
  25. {
  26. pageType = attr.ConfigPageType;
  27. }
  28. }
  29. FrameworkElement page = null;
  30. try
  31. {
  32. page = Activator.CreateInstance(pageType) as FrameworkElement;
  33. }
  34. catch (Exception ex)
  35. {
  36. // 自定义页构造失败不应拖垮宿主,退回默认页
  37. System.Diagnostics.Debug.WriteLine($"创建数据库配置页 {pageType.Name} 失败: {ex.Message}");
  38. }
  39. if (page == null)
  40. page = new DefaultDatabaseConfigPage();
  41. if (database != null && page is IDatabaseConfigPage bindable)
  42. bindable.BindDatabase(database);
  43. return page;
  44. }
  45. }
  46. }