国际奥委会,接口的多个实现

问题描述 投票:2回答:1

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

每个设备的需要的ViewModels注入了正确的服务。

到目前为止,我只用通信的一种形式,所以这是简单,有一个单一出口的接口。不过,我添加了一个串口现在也,而这也正是事情变得对我来说有点模糊。

用于实际通信的接口和实现:

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) { .. }
}

“服务”,它有一堆用于使用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在“正确”的方式解决这个问题?我应该不同模型呢?

dependency-injection inversion-of-control mef
1个回答
1
投票

你可以专注你的网络和串行通信通信。

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

    public interface ISerialCommunication : ICommunication
    {

    }

    public interface INetworkCommunication : ICommunication
    {

    }

    public class SerialCommunication : ISerialCommunication
    {
        public byte[] Send(byte[] message) { .. }
    }

    public class NetworkCommunication : INetworkCommunication
    {
          public byte[] Send(byte[] message) { .. }
    }
© www.soinside.com 2019 - 2024. All rights reserved.