首页 文章

两个源如何从两个源(视图)和其他模块并行交互

提问于
浏览
0

我有一个硬件模块,可以通过用户和另一个模块从View进行交互 .

Question:

我应该在MyModule_A中创建一个单例实例,将此实例注册到我的容器中并使用此容器来解析MyModule_B中的实例吗?

Or

我必须在两个模块之间使用Eventaggregator进行两次通信吗?

在这种情况下,棱镜文档对我来说并不清楚 .

  • 解决方案指挥 . 在期望用户交互立即采取行动时使用 .

  • 地区背景 . 使用此选项可在主机区域中的主机和视图之间提供上下文信息 . 这种方法有点类似于DataContext,但它不依赖于它 .

  • 共享服务 . 呼叫者可以在服务上调用一种方法,该方法将事件引发给消息的接收者 . 如果以上都不适用,请使用此选项 .

  • 事件聚合 . 用于在没有直接的动作反应期望的情况下跨视图模型,演示者或控制器进行通信 .

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 {private string _title =“MyModule_A”; private readonly IRegionManager _regionManager; private readonly IUnityContainer _unityContainer; private readonly IUnityContainer _unityContainer; private readonly 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);
   }
}

1 回答

  • 1

    使用共享服务,即:

    我应该在MyModule_A中创建一个单例实例,将此实例注册到我的容器中并使用此容器来解析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 ) ...
    }
    

相关问题