C# WPF Prism从主项目访问模块内定义的信息,如某些类对象
我在C# WPF Prism从主项目访问模块内定义的信息,如某些类对象,c#,wpf,prism-4,C#,Wpf,Prism 4,我在VS中有一个WPF Prism解决方案,希望在模块项目中的对象中保留我的Prism模块的一些设置(我从文件加载此设置),然后我创建了我的Prism模块(AModule.cs),如下所示: 在我的模块项目中(AModulproject): [Export] [Module(ModuleName = "AModule")] public class AModule : IModule { ModuleSettingsModel ModuleSettings { get ; set; }
VS
中有一个WPF Prism
解决方案,希望在模块项目中的对象中保留我的Prism
模块的一些设置(我从文件加载此设置),然后我创建了我的Prism
模块(AModule.cs
),如下所示:
在我的模块项目中(AModul
project):
[Export]
[Module(ModuleName = "AModule")]
public class AModule : IModule
{
ModuleSettingsModel ModuleSettings { get ; set; }
public AModule()
{
// throw new NotImplementedException();
}
public AModule(IUnityContainer container)
{
// Some codes ....
}
~AModule()
{
// some codes
}
public void Initialize()
{
var regionManager = _container.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("WorkspaceRegion", typeof(ModuleAView));
ModuleSettings = DataFileManager.LoadModuleData();
}
[导出]
[模块(ModuleName=“AModule”)]
公共类模块:IModule
{
模块设置模型模块设置{get;set;}
公共模块()
{
//抛出新的NotImplementedException();
}
公用模块(IUnityContainer容器)
{
//一些代码。。。。
}
~AModule()
{
//一些代码
}
公共无效初始化()
{
var regionManager=_container.Resolve();
regionManager.RegisterViewWithRegion(“工作空间区域”,类型为(ModuleView));
ModuleSettings=DataFileManager.LoadModuleData();
}
它运行良好,我可以在AModule中使用我的设置
内部主要WPF项目
:
[Export]
[Module(ModuleName = "AModule")]
public class AModule : IModule
{
ModuleSettingsModel ModuleSettings { get ; set; }
public AModule()
{
// throw new NotImplementedException();
}
public AModule(IUnityContainer container)
{
// Some codes ....
}
~AModule()
{
// some codes
}
public void Initialize()
{
var regionManager = _container.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("WorkspaceRegion", typeof(ModuleAView));
ModuleSettings = DataFileManager.LoadModuleData();
}
但是我也需要在我的主WPF项目中访问此设置(ModuleSettings
属性)。例如,我需要在我的WPF
应用程序的Bootstrapper
类中访问ModuleSettings
。我需要根据主项目中的每个模块设置做一些工作
我的问题是有什么解决方案?我应该注册任何类型吗?在哪里?如何注册
注1:模块设置*继承自IModuleSettings
,IModuleSettings
位于基础设施项目中
注2:我将模块动态加载到prism中(我的主WPf
项目没有任何对AModule的引用)您应该将模块设置放入由各个模块/项目引用的类库项目中。您可以使用singleton模式仅加载和维护设置的一个实例。在阅读了&@BenediktSchroeder的第一条有问题的评论,并阅读了一些其他引用,如&,i can found&i实现我的问题的一个好方法:
我通过添加一个新的定制Prism服务
在基础设施项目
中为我们的服务类(eq.ISettingManager
)创建一个接口。模块和主应用程序需要参考基础设施项目
为我们的服务创建一个类(eq.SettingManager
)
在ISettingManager
中定义一个属性以保持模块设置
如下:
字典模块设置SPAIRS{get;set;}
将ISettingManager
中的一些方法添加到Get
,Add
和Remove
设置到ModuleSettingsPairs
字典中
在bootstraper
内的ConfigureContainer
中将新服务类型注册为Singlton
如下:
RegisterTypeIfMissing(typeof(IAddonSettingsManager),typeof(AddonSettingsManager),true);
获取对模块项目
或主应用程序项目
中的IAddonSettingsManager
服务实例的引用,可以通过以下方式之一执行:
- 使用构造函数注入以声明方式获取对服务的引用
- 以编程方式获取对服务的引用(使用
Unity容器的Resolve
方法)
最后,使用我们服务实例的自定义Get
、Add
和Remove
方法(SettingManager
)
在我的项目中,我使用自定义属性用有关必须在全局上下文中加载的资源的信息来装饰我的模型。您也可以使用您的设置来完成此操作。注册模块时只需检查这些设置。在全局上下文中保存设置的另一种方法是注册某种设置提供程序er在加载任何模块之前。在您的模块中,您可以解析该提供程序并注册您的设置。@BenedikSchroeder,谢谢,我需要两个关于您的2解决方案的简单示例。我需要知道如何使用这些方法,如何以及在何处注册新类型。请您写一个答案,包括一些关于这些解决方案的有用信息。另请参阅一些外部示例和文章的链接可以帮助我…不,我不会引用任何引用…我需要完全动态地访问模块中创建的对象。我认为Prism有一些工具可以做到这一点。谢谢,我的意思是不会有新类库和其他引用,但您的方法是正确的,但您的回答没有帮助我了解“在哪里”和“如何”这是我的问题。这就是我所理解的,在我看来是一个干净的解决方案。