上次说到自动扫描的两种方式,接下来,先看看第一种方法,接口的注册
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;
}
}
标签:assembly,TextDemo,扫描,myType,&&,type,var,续写,上次
From: https://www.cnblogs.com/guchen33/p/18064209