c# - 没有服务定位器的多个实例的依赖注入
问题描述
我正在编写一个 WPF 应用程序,使用 Unity 作为 Ioc 进行依赖注入
我创建我的主窗口:
container.RegisterType<IMainWindow, MainWindow>();
container.RegisterType<ISecondWindow, SecondWindow>();
container.Resolve<IMainWindow>().Show();
所有其他窗口都注入依赖注入,例如在我的“MainWindow”中,我可以通过“SecondWindow”按钮打开,所以我在 MainWindow 构造函数中有 ISecondWindow
public partial class MainWindow: Window, IMainWindow
{
public MainWindow(IMainWindowViewModel viewModel, ISecondWindow secondWindow)
{
//with this solution I can open the second window from IMainWindowViewModel (viewmodels has no reference to windows which are in a separate project)
viewModel.OpenSecondWindow += (s,e) => secondWindow.Show();
}
SecondWindow 没有其他窗口,因此它在他的构造函数中只定义了 ViewModels
public partial class SecondWindow: Window, ISecondWindow
{
public SecondWindow(ISecondWindowViewModel viewModel)
然后在级联中解决所有依赖项(WINDOW -> VIEWMODEL -> SERVICE -> REPOSITORY)
在我只有第二个窗口的一个实例之前,这完全有效,但是......
如果我可以同时打开我的 ISecondWindow 的 N 个窗口/实例(例如,我有一个列表,我双击第一行并且 ISecondWindow 以第一行详细信息打开,然后我双击第二行和另一个ISecondWindow 以第二行详细信息打开(因此我可以同时查看第一行和第二行详细信息))?
使用 DI 无法做到这一点,因为我拥有并且只能使用我的 ISecondWindow 的一个实例。
我想解决这个问题的唯一解决方案是使用服务定位器,但服务定位器是一种反模式,我不会使用它。
你有什么想法/建议来解决这个问题吗?
解决方案
尝试使用 TransientLifetimeManager 注册您的 ISecondWindow。
http://www.tutorialsteacher.com/ioc/lifetime-manager-in-unity-container
推荐阅读
- elasticsearch - 是否有任何方法/建议对关键字进行分类,以便在弹性搜索中减少搜索空间?
- php - phpmyadmin 查询失败
- windows - Windows商店证书导入证书颁发机构(ca.crt)+主机私钥(host.key)+主机公钥(host.der)
- angular - 我想在primeng p-table分页器中显示“全部”作为一个选项
- javascript - 我正在尝试从 Rest API 获取 json 数据以做出反应,但它显示了一些错误
- flutter - 接收 bloc 信息时 UI 未完全更新
- rest - 用于创建资源的 REST API 补丁方法
- javascript - 比较两个对象属性但不能正常工作
- django - 如何将额外的自定义 Django 管理站点指向单独的模板(同时保留默认管理站点)
- selenium - 从在线购物网站复制订单号