2016-08-11 72 views
0

我試圖根據某些條件將相同的實例注入一些對象,並將另一個實例注入另一個對象列表。基於簡單注射器中的上下文注入相同的實例

interface IChannelContext 
{ 
    TransformManyBlock<byte[], Message> Decoder { get; } 
    IFilter Filter { get; } 
} 

interface IMsgSeqNumFilter 
{ 
    bool CheckMsgSeqNumGreater(byte[] buffer); 
} 

class ChannelContext : IChannelContext 
{ 
    public TransformManyBlock<byte[], Message> Decoder { get; } 
    public IMsgSeqNumFilter MsgSeqNumFilter { get; } 

    public ChannelContext(TransformManyBlock<byte[], Message> decoder, IMsgSeqNumFilter msgSeqNumFilter) 
    { 
     Decoder = decoder; 
     MsgSeqNumFilter = msgSeqNumFilter; 
    } 
} 

class MsgSeqNumFilter : IMsgSeqNumFilter 
{ 
    int maxMsgSeqNum = -1; 

    public bool CheckMsgSeqNumGreater(byte[] buffer) 
    { 
     return true; 
    } 
} 

所以我必須爲相同的解碼器實例注入相同的過濾器實例。對於不同的解碼器實例,應該注入不同的實例。

我該怎麼做?謝謝。

更新1根據Steven的評論的對象圖。不使用容器和接口。

class MsgSeqNumFilter 
{ 
    int maxMsgSeqNum = -1; 

    public bool CheckMsgSeqNumGreater(byte[] buffer) 
    { 
     return true; 
    } 
} 

class NetworkAddress 
{ 
    public string IP { get; } 
    public int Port { get; } 

    public NetworkAddress(string ip, int port) 
    { 
     IP = ip; 
     Port = port; 
    } 
} 

class ChannelContext 
{ 
    public NetworkAddress Address { get; } 
    public TransformManyBlock<byte[], Message> Decoder { get; } 
    public MsgSeqNumFilter MsgSeqNumFilter { get; } 

    public ChannelContext(NetworkAddress address, TransformManyBlock<byte[], Message> decoder, MsgSeqNumFilter msgSeqNumFilter) 
    { 
     Address = address; 
     Decoder = decoder; 
     MsgSeqNumFilter = msgSeqNumFilter; 
    } 
} 

class NetworkManager 
{ 
    CancellationToken parentToken; 

    public MulticastReceiveManager(IEnumerable<ChannelContext> channels, CancellationToken parentToken) 
    { 
     this.parentToken = parentToken; 
     foreach (var channelContext in channels) AddChannel(channelContext); 
    } 

    public void AddChannel(ChannelContext channelContext) 
    { 
    } 
} 

class PacketDecoder 
{ 
    public TransformManyBlock<byte[], Message> DecoderA { get; } = new TransformManyBlock<byte[], Message>(); 
    public TransformManyBlock<byte[], Message> DecoderB { get; } = new TransformManyBlock<byte[], Message>(); 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var parentTokenSource = new CancellationTokenSource(); 

     NetworkAddress addrA1 = new NetworkAddress("1.1.1.1", 101); 
     NetworkAddress addrA2 = new NetworkAddress("1.1.1.2", 102); 
     MsgSeqNumFilter filterA = new MsgSeqNumFilter(); 
     NetworkAddress addrB1 = new NetworkAddress("2.2.2.1", 201); 
     NetworkAddress addrB2 = new NetworkAddress("2.2.2.2", 202); 
     MsgSeqNumFilter filterB = new MsgSeqNumFilter(); 

     var packetDecoder = new PacketDecoder(); 
     var channels = new List<ChannelContext>(); 
     channels.Add(new ChannelContext(addrA1, packetDecoder.DecoderA, filterA); 
     channels.Add(new ChannelContext(addrA2, packetDecoder.DecoderA, filterA); 
     channels.Add(new ChannelContext(addrB1, packetDecoder.DecoderB, filterB); 
     channels.Add(new ChannelContext(addrB2, packetDecoder.DecoderB, filterB); 

     var NetworkManager = new NetworkManager (channels, parentTokenSource.Token); 
    } 
} 
+1

嘗試使用依賴注入? – mateudu

+0

你如何創建ChannelContext實例? – lavrik

+0

我不明白你想達到什麼目的。你能否更新你的問題並展示你的對象圖應該是什麼樣子的例子。或者實例,你可以通過顯示如何在沒有容器的情況下'new'圖表來實現這一點(例如,像[本博文]中的示例)(http://blog.ploeh.dk/2012/11/06/WhentouseaDIContainer /))。 – Steven

回答

-2

創建static陣列的解碼器並傳遞給你的ChannelContext實例。考慮使用依賴注入

+0

你的回答非常廣泛。是否有可能更具體,也許代碼示例說明了這將如何解決提問者的特定問題? –

相關問題