2016-03-07 81 views
2

我正在製作一個與設備通信的應用程序。這可以通過多種物理方式完成,即串行端口和網絡(串行端口上的單個設備,網絡上的多個設備)。IoC,多接口實現

每個設備的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) { .. } 
} 

該「服務」,其具有一串用於發送使用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) 
    { .. } 
} 

此前我j在我需要的地方,ust在構造函數中導入了IMessagingService,並且工作得很好。但是現在我添加了ICommunication的第二個實現,這個策略失敗了。

在應用程序的生命週期中,它將有一個用於在串行端口上通信的DeviceViewModel實例。其他實例使用網絡服務。

如何用「正確」方式解決這個問題?我應該以不同的方式建模嗎

回答

1

您可以專門爲您的網絡和串行通信ICommunucation。

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