IoC,接口

时间:2016-03-07 16:01:02

标签: dependency-injection inversion-of-control mef

我正在创建一个与设备通信的应用程序。这可以通过多种物理方式完成,即串行端口和网络(串行端口上的单个设备,网络上的多个设备)。

每个设备的ViewModel都需要注入正确的服务。

到目前为止,我只使用了一种形式的通信,因此对接口进行单一导出很简单。但是,我现在也为串口添加了一个,这对我来说有点模糊。

实际沟通的界面和实现:

public interface ICommunication
{
    public byte[] Send(byte[] message);
}

[Export(typeof(ICommunication)]
[PartCreationPolicy(CreationPolicy.Shared)]
public class SerialCommunication : ICommunication
{
    public byte[] Send(byte[] message) { .. }
}

[Export(typeof(ICommunication)]
[PartCreationPolicy(CreationPolicy.Shared)]
public class NetworkCommunication : ICommunication
{
    public byte[] Send(byte[] message) { .. }
}

" service",它有一堆使用ICommunication发送消息并返回回复的方法:

[Export(typeof(IMessagingService)]
[PartCreationPolicy(CreationPolicy.Shared)]
public class MessagingService : IMessagingService
{
    ICommunication _communication;

    [ImportingConstructor]
    public MessagingService(ICommunication communication)
    {
        _communication = communication;
    }

    public DateTime GetDeviceTime()
    {
        var response = _communication.Send(new GetTimeMessage().Serialize());
    }
    ...
}

使用服务的ViewModel:

[Export(typeof(DeviceViewModel)]
public class DeviceViewModel
{
    IMessagingService _service;

    [ImportingConstructor]
    public DeviceViewModel(IMessagingService service)
    { .. }
}

之前我只是在构造函数中导入IMessagingService,无论我需要它,这都很有效。但是现在我添加了ICommunication的第二个实现,这个策略失败了。

在应用程序的生命周期内,它将有一个DeviceViewModel实例,用于在串行端口上进行通信。其他实例使用网络服务。

如何在"纠正"中使用MEF解决这个问题?办法?我应该以不同的方式建模吗

1 个答案:

答案 0 :(得分:1)

您可以专门针对网络和串行通信进行ICommunucation。

 ------
|  B1  |
 ------
|  0   |
|  1   |
|  0   |