Prism IOC的依赖注入

news/2024/9/29 17:13:39

IOC的依赖注入
一、构造函数方式的依赖注入
默认情况下Prism框架的项目,在打开窗口时会自动匹配主窗口的视图模型类(PrismApplication启动),这里是MainWindowViewModel,匹配到之后Container自动创建MainWindowViewModel的实例,创建时会先检查MainWindowViewModel有没有无参构造函数,如果没有则会检查构造函数的参数类型,并在Container内部列表中寻找对应类型并创建参数对象,然后使用该参数对象来创建MainWindowViewModel。
设置好PrismApplication启动方式后,做以下处理实现IOC的构造函数依赖注入:

创建业务接口及实现类

public interface IDataAccessBase
{DataTable GetDatas(string condition);
}public class DataAccess : IDataAccessBase
{public DataTable GetDatas(string condition){//做数据访问业务return null;}
}
public class MainWindowViewModel
{public MainWindowViewModel(IDataAccessBase dataAccess){var data = dataAccess.GetDatas("模拟一下");}
}

类型注册
RegisterTypes函数中注册依赖类型

public partial class App : PrismApplication
{......protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.Register<IDataAccessBase, DataAccess>();}
}```## 二、特性方式的依赖注入注意,特性方式的注入时机要比构造函数方式的注入时机晚,因此如果需要在对象构造时使用依赖对象的话,最好用构造函数依赖注入的方式。**类型注册**
在`RegisterTypes`函数中注册依赖类型
```csharp
public partial class App : PrismApplication
{......protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.Register<IDataAccessBase, DataAccess>();}
}
特性标注
使用Prism.Unity命名空间下的Dependency标注属性成员,Prism框架会从IOC容器中寻找对应的类型并注入到属性中。如果在IOC容器中找不到,则会报错。
public class MainWindowViewModel
{[Dependency]public IDataAccessBase DataAccess{ get; set; }
}
三、注册&注入已经存在的实例对象
有些情况下希望直接将一个已经存在的实例对象注册到IOC容器中;或者某个接口只返回接口类型的对象时,无法通过接口+实现类的方式注册到IOC容器中,
只能先创建该实例对象,然后将实例对象注册到IOC容器中(例如Log4net)。这个时候可以使用IContainerRegistry对象的RegisterInstance方法。
1、注册
public partial class App : PrismApplication
{......protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterInstance(LogManager.GetLogger("Test"));//可以指定名称//containerRegistry.RegisterInstance(LogManager.GetLogger("Test"), TestLog);
    }
}

2、注入

注入方式,跟上文的一样,可以通过特性或者构造参数。
需要注意的是,如果指定了名称,就只能通过特性指定名称注入或者使用IUnityContainerIContainerExtension对象实例来获取了。

public MainWindow(ILog log)
{InitializeComponent();log.Error("错误", new Exception("发生了一个异常"));//错误log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误log.Info("信息"); //记录一般信息log.Debug("调试信息");//记录调试信息log.Warn("警告");//记录警告信息
}

IUnityContainer
一、获取注册信息
IUnityContainer接口的实例中存放了IOC容器中的注册信息,其中包括Prism框架默认注册的以及我们自己注册的。
以下为常用的三种注册方式后,IUnityContainer实例中存放注册信息的不同状态。

注册接口与类型,没有设置名称

public partial class App : PrismApplication
{......protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.Register<ITestClass, TestClass>();}
}

不同的注册方式会导致注册信息的状态有所不同,其中导航、视图、类型的注册根据不同情况也有所不同,在实际开发过程中可以先监控一下IUnityContainer实例中的注册信息再根据实际情况来使用。

需要注意的是,如果在注册过程中设置了name属性,那么在向容器中获取对象时,也要使用对应的name来获取,如果还使用类名来获取,会直接报错。

二、从容器中获取对象
除了能在IUnityContainer实例中获取到IOC容器的注册信息外,还能通过实例方法Resolve<T>()从容器中获取指定的依赖对象。
此外,从IContainerProvider实例的Resolve<T>()方法中也可以从容器中获取指定的依赖对象。

public partial class App : PrismApplication
{......protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterSingleton<ITestClass, TestClass>();}
}
public class MainWindowViewModel
{public MainWindowViewModel(IUnityContainer unityContainer,  IContainerProvider containerProvider){var a = unityContainer.Resolve<ITestClass>();var b = containerProvider.Resolve<ITestClass>();var result = a == b;    //true
    }
}

三、实例-Region中删除指定视图

public class FileUploadViewModel:BindableBase
{//页签关闭命令public ICommand CloseCommand { get; set; }public FileUploadViewModel(IRegionManager regionManager, IUnityContainer unityContainer){CloseCommand = new DelegateCommand<string>(uri =>{//从IUnityContainer 实例中获取指定的注册信息对象var obj = unityContainer.Registrations.Where(r => r.Name == uri || r.MappedToType == Type.GetType("FileUploadView")).FirstOrDefault();var name = obj?.MappedToType.Name;if (!string.IsNullOrEmpty(name)){var region = regionManager.Regions["MainViewRegion"];var view = region.Views.Where(v=> v.GetType().Name == name).FirstOrDefault();if (view != null)region.Remove(view);}});}
}

IContainerExtension
Prism的IOC容器中默认注册的还有IContainerExtension接口,该接口实现了IContainerProvider和IContainerRegistry接口,因此其实现类的实例对象同时具有注册和从容器中获取对象的功能,如果希望在App类中的RegisterTypes方法之外的地方向容器注册的话,可以通过IContainerExtension的实例对象来完成。

public class MainWindowViewModel
{public MainWindowViewModel(IUnityContainer unityContainer,  IContainerExtension containerProvider){containerProvider.Register<TestClass>();var test = containerProvider.Resolve<TestClass>();}
}
来源:https://blog.csdn.net/jjailsa/article/details/141994503

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

活体标签的内部主芯片-SI24R2F+

Si24R2F+ 是一颗工作在2.4GHz ISM 频段,专为低功耗无线场合设计,集成嵌入式发射基带的无线发射芯片。工作频率范围为 2400MHz-2525MHz,共有126个1MHz带宽的信道。Si24R2F+ 采用GFSK/FSK 数字调制与解调技术。数据传输速率与 PA 输出功率都可以调节,支持 2Mbps,1Mbps,250Kbp…

20242822《Linux内核原理与分析》第二周作业

实验楼上配套实验一 1.创建main.c文件 touch main.c vim main.c2.将main.c文件编译成汇编代码 gcc –S –o main.s main.c -m32 这条命令的含义是:gcc: 调用 GCC 编译器。 -S: 只生成汇编代码,不生成可执行文件。 -o main.s: 指定输出文件名为 main.s。 main.c: 输入的 C 源文…

从0到1搭建权限管理系统系列四 .net8 中Autofac的使用(附源码)

说明该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。 友情提醒:本篇文章是属于系列文章,…

React周视图组件封装

技术栈:React、antd需求背景 使用周视图来显示广播信息与状态 组件特点当多个广播时间段交叠时,并行显示。对于交叠广播,最多显示3个,如果要显示全部交叠的广播,可点击展开。 可对时间段精度进行扩展。当多个时间短但不重叠的广播放在一起时,更方便看。 支持点击回到本周…

【问题解决】win10日志错误:创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013

背景 最近win10死机了一次,查看事件管理器发现有大量的报错:“创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013”,如图:解决 win键搜索internet选项原因 参考错误:“ 创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013”的说法是win10对TLSv3.0兼容性…

2024-2025-1 20241415 《计算机基础与程序设计》第1周学习总结

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里 2024-2025-1计算机基础与程序设计第一周作业这个作业的目标 阅读浏览教材《计算机科学概论》,加深对计算机科学的理解,提高自学能力,学…

Prism 行为处理

Prism框架提供了DelegateCommand类型,专门用于进行WPF中的行为处理。 基本使用一、命令的使用DelegateCommand(Action executeMethod):DelegateCommand的构造函数,创建DelegateCommand对象。 executeMethod:无参的命令执行函数。定义命令public class MainViewModel {publi…

南沙C++信奥赛老师解一本通题1217:棋盘问题

​【题目描述】在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 kk 个棋子的所有可行的摆放方案 CC。【输入】输入含有多组测试数据。 每组数据…