如何等待另一个棱镜模块中的方法?

How to await a method in another prism module?

我一直在尝试使用 Prism,并决定使用 Prism + WPf + Unity 将应用程序转换为模块化 Prism 应用程序。

此应用程序与各种硬件进行对话,因此第一件事就是将我所有的硬件 classes 放入单独的模块中。

以我的相机 class 为例,它通过以太网与相机系统通信。

假设我的相机 class 是这样的(在 PRISM 转换之前)

Public Class Camera
{
    // bunch of properties 

    public Task<bool> TakePhoto()
    {
       return Task.Run(()=>
       {
          // ...
          // Do taking photo stuff
          // ...    
          return CameraPhotoTakenResult; // Return result of taking photo 
       });
    }
}

PRISM 转换之前,我这样调用 TakePhoto method

var TakePhoto = MyCamera.TakePhoto();

// ...
// Do some stuff and call other methods
// ...  

var result = await TakePhoto;

// Check the result and do something with it
// ...
// Continue doing other stuff

根据我的理解,我现在必须使用 EventAggregator 来触发相机,这很好,但这是否意味着我必须使用另一个事件来发回结果?如果是这样,那么我该如何修改我的代码来等待这个?

您可以正常使用该类型。将 class 的 public 接口拆分成一个通用项目,您的硬件模块和消费者都将引用该项目。您的硬件模块在某种依赖注入容器中注册了一个 class(我的示例将使用 Unity):

public class HardwareModule : IModule
{
    IUnityContainer _container;
    public HardwareModule(IUnityContainer container)
    {
        _container = container;
    }

    public void Initialize()
    {
        _container.RegisterType<ICamera, Camera>();
    }
}

然后在consumer中,从container中获取一个instance,然后正常使用对象。

public class HardwareConsumer
{
    IUnityContainer _container;
    public HardwareConsumer(IUnityContainer container)
    {
        _container = container;
    }

    public async void TakePhoto()
    {
        ICamera camera = _container.Resolve<ICamera>();

        var result = await camera.TakePhoto;
    }
}

但是由于这是使用依赖注入来注入容器,如果您对容器没有其他需求,您可以also/instead将实例注入到您的class:

public class HardwareConsumer2
{
    ICamera _camera;
    public HardwareConsumer2(ICamera camera)
    {
        _camera = camera;
    }

    public async void TakePhoto()
    {
        var result = await _camera.TakePhoto;
    }
}