续写上次自动扫描注册

上次说到自动扫描的两种方式,接下来,先看看第一种方法,接口的注册

  protected override void RegisterTypes(IContainerRegistry containerRegistry)
  {
      TextDemo textDemo = new TextDemo(containerRegistry);
      textDemo.RegisterService().RegisterRepository().RegisterForNavigation().RegisterDialog();
  }

为了完成我上面的链式编程,我们需要对程序进行改造,以下是完整代码

 public class TextDemo
 {
     IContainerRegistry container;
     public TextDemo(IContainerRegistry containerRegistry)
     {

         container = containerRegistry;

     }
     /// <summary>
     /// 注册服务
     /// </summary>
     /// <param name="containerRegistry"></param>
     /// <returns></returns>
     public TextDemo RegisterService()
     {
         var assembly = Assembly.GetExecutingAssembly(); // 获取当前执行的程序集
         var types = assembly.GetTypes()
             .Where(myType => myType.IsClass && !myType.IsAbstract && typeof(IPrismService).IsAssignableFrom(myType)); 

         foreach (var type in types)
         {
             container.RegisterScoped(typeof(IPrismService), type); 
                                                                       
         }
         return this;
     }

     /// <summary>
     /// 注册仓储
     /// </summary>
     /// <param name="containerRegistry"></param>
     /// <returns></returns>
     public TextDemo RegisterRepository()
     {
         var assembly = Assembly.GetExecutingAssembly(); // 获取当前执行的程序集
         var types = assembly.GetTypes()
             .Where(myType => myType.IsClass && !myType.IsAbstract && typeof(IPrismRepository).IsAssignableFrom(myType)); 

         foreach (var type in types)
         {
             container.RegisterScoped(typeof(IPrismRepository), type); 

         }
         return this;
     }

     /// <summary>
     /// 注册视图
     /// </summary>
     /// <param name="containerRegistry"></param>
     /// <returns></returns>
     public TextDemo RegisterForNavigation()
     {
         var assembly = Assembly.GetExecutingAssembly();
         var viewModelsNamespace = "ViewModels";
         var viewsNamespace = "Views";

         var viewModelTypes = assembly.GetTypes()
             .Where(t => t.Namespace != null && t.Namespace.Contains(viewModelsNamespace) && t.Name.EndsWith("ViewModel"))
             .ToList();

         var viewTypes = assembly.GetTypes()
             .Where(t => t.Namespace != null && t.Namespace.Contains(viewsNamespace) && t.Name.EndsWith("View"))
             .ToList();

         foreach (var viewModelType in viewModelTypes)
         {
             var viewType = viewTypes.FirstOrDefault(v => v.Name == viewModelType.Name.Replace("ViewModel", "View"));
             if (viewType != null)
             {
                 container.RegisterForNavigation(viewType,viewModelType.ToString());
             }
         }
         return this;
     }

     /// <summary>
     /// 注册弹窗
     /// </summary>
     /// <param name="containerRegistry"></param>
     /// <returns></returns>
     public TextDemo RegisterDialog()
     {
         var assembly = Assembly.GetExecutingAssembly(); // 获取当前执行的程序集

         var dialogVMTypes = assembly.GetTypes()
             .Where(myType => myType.IsClass && !myType.IsAbstract && typeof(IDialogAware).IsAssignableFrom(myType));

         var doalogTypes = assembly.GetTypes()
            .Where(t => t.Namespace != null &&  t.Name.EndsWith("Dialog"))
            .ToList();
         foreach (var type in dialogVMTypes)
         {
             var viewType = doalogTypes.FirstOrDefault(v => v.Name == type.Name.Replace("ViewModel", "View"));
             if (viewType != null)
             {
                 container.RegisterForNavigation(viewType, type.ToString());
             }

         }
         return this;
     }
 }

注意,这里的写法,完全取决于你的View和Dialog的命名方式,一般情况下,我的命名是
HomeView--->HomeViewModel
ErrorDialog--->ErrorDialogViewModel
如果你们自定义命名的时候,需要用到Prism的ViewModelLocationProvider.Register,切记

本文作者:孤沉

本文链接:https://www.cnblogs.com/guchen33/p/18064209

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   孤沉  阅读(10)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开