两个如何从两个源(视图)和其他模块并行交互
How two interact from two sources (view) and other Module in parallel
我有一个硬件模块,可以从用户视图和另一个模块进行交互。
问题:
我是否可以在 MyModule_A 中创建一个单例实例,将此实例注册到我的容器中并使用此容器来解析 MyModule_B 中的实例?
或
我必须使用 Eventaggregator 在两个模块之间进行通信吗?
棱镜文档在那种情况下对我来说不清楚。
解指挥。当有立即的期望时使用
来自用户交互的操作。
区域上下文。使用它来提供上下文信息
主机和主机区域中的视图。这种做法有点
类似于DataContext,但不依赖它。
共享服务。调用者可以调用服务上的方法
向消息的接收者引发一个事件。在 none 的情况下使用此
以上是适用的。
事件聚合。用于跨视图模型、演示者的通信,
或控制器,当没有直接的动作反应时
期待。
public class MyModule_A : IModule
{
IRegionManager _regionManager;
私有 IUnityContainer _container;
私人 ILoggerFacade _logger;
public MyModule(IRegionManager regionManager, IUnityContainer container)
{
regionManager = regionManager;
_container = container;
}
public void Initialize()
{
_unityContainer.RegisterType<IMyHardware, MyHardware>(new Containercontrolledlifetime);
}
}
public class MyModule_AViewModel : BindableBase
{
私有字符串_title = "MyModule_A";
私有只读 IRegionManager _regionManager;
私有只读 IUnityContainer _unityContainer;
私有只读 IUnityContainer _unityContainer;
私人只读 ILoggerFacade _logger;
私人 IMyHardware _myhardware;
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
public MyModuleViewModel(IRegionManager regionManager, IUnityContainer unityContainer)
{
_unityContainer = unityContainer;
_logger = unityContainer.Resolve<ILoggerFacade>();
_myhardware = unityContainer.Resolve<IMyHardware>();
_logger.Log("ViewModel created", Category.Debug, Priority.Medium);
}
public class MyModule_B : IModule
{
IRegionManager _regionManager;
private IUnityContainer _container;
private ILoggerFacade _logger;
private IHardware _myhardware;
public MyModule(IRegionManager regionManager, IUnityContainer container)
{
regionManager = regionManager;
_container = container;
}
public void Initialize()
{
}
}
public class MyModule_BViewModel : BindableBase
{
private string _title = "MyModule_B";
private readonly IRegionManager _regionManager;
private readonly IUnityContainer _unityContainer;
private readonly ILoggerFacade _logger;
private IMyHardware _myhardware;
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
public MyModule_BViewModel(IRegionManager regionManager, unityContainer unityContainer)
{
_unityContainer = unityContainer;
_logger = unityContainer.Resolve<ILoggerFacade>();
_myhardware = unityContainer.Resolve<IMyHardware>();
_logger.Log("ViewModel created", Category.Debug,Priority.Medium);
}
}
使用共享服务,即:
Shall I create a singleton instance in the MyModule_A, register this instance two my container and use this container to resolve the instance in MyModule_B?
在模块 a 和模块 b 引用的第三个程序集(不是模块)中为您的驱动程序创建一个接口。然后在模块a中注册驱动程序,并将其注入视图模型或模块b或c甚至a中的任何内容。
素描:
// in the interface-assembly:
public interface IDriver
{
bool ReadSensor();
}
// in module a:
internal class MyDriver : IDriver ...
public class MyModuleA : IModule
{
public void Initialize()
{
_container.RegisterType<IDriver, MyDriver>( new ContainerControlledLifetimeManager() );
}
}
// in module b:
internal class MyViewModel
{
public MyViewModel( IDriver theHardware ) ...
}
我有一个硬件模块,可以从用户视图和另一个模块进行交互。
问题:
我是否可以在 MyModule_A 中创建一个单例实例,将此实例注册到我的容器中并使用此容器来解析 MyModule_B 中的实例?
或
我必须使用 Eventaggregator 在两个模块之间进行通信吗?
棱镜文档在那种情况下对我来说不清楚。
解指挥。当有立即的期望时使用 来自用户交互的操作。
区域上下文。使用它来提供上下文信息 主机和主机区域中的视图。这种做法有点 类似于DataContext,但不依赖它。
共享服务。调用者可以调用服务上的方法 向消息的接收者引发一个事件。在 none 的情况下使用此 以上是适用的。
事件聚合。用于跨视图模型、演示者的通信, 或控制器,当没有直接的动作反应时 期待。
public class MyModule_A : IModule
{ IRegionManager _regionManager; 私有 IUnityContainer _container; 私人 ILoggerFacade _logger;
public MyModule(IRegionManager regionManager, IUnityContainer container) { regionManager = regionManager; _container = container; } public void Initialize() { _unityContainer.RegisterType<IMyHardware, MyHardware>(new Containercontrolledlifetime); }
}
public class MyModule_AViewModel : BindableBase { 私有字符串_title = "MyModule_A"; 私有只读 IRegionManager _regionManager; 私有只读 IUnityContainer _unityContainer; 私有只读 IUnityContainer _unityContainer; 私人只读 ILoggerFacade _logger; 私人 IMyHardware _myhardware;
public string Title { get { return _title; } set { SetProperty(ref _title, value); } } public MyModuleViewModel(IRegionManager regionManager, IUnityContainer unityContainer) { _unityContainer = unityContainer; _logger = unityContainer.Resolve<ILoggerFacade>(); _myhardware = unityContainer.Resolve<IMyHardware>(); _logger.Log("ViewModel created", Category.Debug, Priority.Medium); } public class MyModule_B : IModule { IRegionManager _regionManager; private IUnityContainer _container; private ILoggerFacade _logger; private IHardware _myhardware; public MyModule(IRegionManager regionManager, IUnityContainer container) { regionManager = regionManager; _container = container; } public void Initialize() { } } public class MyModule_BViewModel : BindableBase { private string _title = "MyModule_B"; private readonly IRegionManager _regionManager; private readonly IUnityContainer _unityContainer; private readonly ILoggerFacade _logger; private IMyHardware _myhardware; public string Title { get { return _title; } set { SetProperty(ref _title, value); } } public MyModule_BViewModel(IRegionManager regionManager, unityContainer unityContainer) { _unityContainer = unityContainer; _logger = unityContainer.Resolve<ILoggerFacade>(); _myhardware = unityContainer.Resolve<IMyHardware>(); _logger.Log("ViewModel created", Category.Debug,Priority.Medium); } }
使用共享服务,即:
Shall I create a singleton instance in the MyModule_A, register this instance two my container and use this container to resolve the instance in MyModule_B?
在模块 a 和模块 b 引用的第三个程序集(不是模块)中为您的驱动程序创建一个接口。然后在模块a中注册驱动程序,并将其注入视图模型或模块b或c甚至a中的任何内容。
素描:
// in the interface-assembly:
public interface IDriver
{
bool ReadSensor();
}
// in module a:
internal class MyDriver : IDriver ...
public class MyModuleA : IModule
{
public void Initialize()
{
_container.RegisterType<IDriver, MyDriver>( new ContainerControlledLifetimeManager() );
}
}
// in module b:
internal class MyViewModel
{
public MyViewModel( IDriver theHardware ) ...
}