【发布时间】:2021-08-20 13:56:26
【问题描述】:
我觉得我看到这个问题问了很多,但是我看到的大多数教程/示例都已经过时了,因为 UnityBootstrapper 类已经过时并且似乎已经被贬值了。我似乎只能找到PrismBootstrapper,它没有实现与UnityBootstrapper 相同的功能。
谁能给我一个如何使用PrismBootstrapper 的例子,或者指出我在尝试从UnityBootstrapper 派生时做错了什么?
编辑:这是我需要让 MVVM Prism.Unity with Bootstrapper 工作。我不明白如何正确配置 IModuleCatalog 或 RegisterTypes。我还是不太明白 RegisterTypes 是做什么的,或者如何使用我注册的接口。
-
我创建了 2 个项目。名为 MRC 和 AlertsLogger 的主项目(WPF 应用程序(.NET Framework))。
-
这是我的引导程序的代码。这是设置为在运行时运行而不是打开窗口。
using System;
using System.Windows;
using AlertsLogger.Interfaces;
using MRC.Framework.Core.Data.Connectivity;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Unity;
using Unity;
namespace MRC
{
[Obsolete]
public class BootStrapper : PrismBootstrapper
{
#region Override Methods
protected override DependencyObject CreateShell()
{
return Container.Resolve<Shell>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterInstance<IListener>(new Listener());
containerRegistry.RegisterInstance<IConnectionProvider>(new ConnectionProvider());
containerRegistry.RegisterInstance<ISettingsProvider>(new SettingsProvider());
}
protected override void InitializeShell(DependencyObject shell)
{
base.InitializeShell(shell);
App.Current.MainWindow = (Window)shell;
App.Current.MainWindow.Show();
}
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
base.ConfigureModuleCatalog(moduleCatalog);
Type ModuleLocatorType = typeof(AlertsLogger.ModuleLocators);
moduleCatalog.AddModule(new Prism.Modularity.ModuleInfo
{
ModuleName = ModuleLocatorType.Name,
ModuleType = ModuleLocatorType.AssemblyQualifiedName
});
}
#endregion
}
}
- 在 AlertsLogger 项目中,我必须创建一个名为 ModuleLocators 的类。
public class ModuleLocators : IModule
{
#region private properties
/// <summary>
/// Instance of IRegionManager
/// </summary>
private IRegionManager _regionManager;
#endregion
#region Constructor
/// <summary>
/// parameterized constructor initializes IRegionManager
/// </summary>
/// <param name="regionManager"></param>
public ModuleLocators(IRegionManager regionManager)
{
_regionManager = regionManager;
}
#endregion
#region Interface methods
/// <summary>
/// Initializes Welcome page of your application.
/// </summary>
/// <param name="containerProvider"></param>
public void OnInitialized(IContainerProvider containerProvider)
{
_regionManager.RegisterViewWithRegion("Shell", typeof(Views.LoggerDataView));
}
/// <summary>
/// RegisterTypes used to register modules
/// </summary>
/// <param name="containerRegistry"></param>
public void RegisterTypes(IContainerRegistry containerRegistry)
{
}
#endregion
}
【问题讨论】:
-
您不想创建自己的容器,而是在
RegisterTypes中使用提供者IContainerRegistry。 -
好的,我对其进行了编辑以将其添加到
IContainerRegistry,但我不确定如何使用它。我知道如果我创建一个类,比如说TestClass并创建一个构造函数public TestClass(Interface InterfaceName){}它应该通过,但是我需要在该类中创建一个新实例还是应该通过注册来处理实例? -
如果你解析
TestClass,容器将尝试解析InterfaceName,并在其中放置一个实例,如果它知道要使用哪个实例。它还将负责生命周期管理,例如单例或瞬态实例。您必须为要解析的所有接口注册实现,具体类型会自动解析...但这确实是一个很大的领域,最好阅读一些有关依赖注入和控制反转的书籍...