如何等待另一个棱镜模块中的方法?
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;
}
}
我一直在尝试使用 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;
}
}