续写上次自动扫描注册
上次说到自动扫描的两种方式,接下来,先看看第一种方法,接口的注册
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步