0

いくつかの条件に基づいて、同じインスタンスをオブジェクトの一部に挿入し、別のインスタンスを別のオブジェクトのリストに挿入しようとしています。Simple Injectorのコンテキストに基づいて同じインスタンスを挿入する

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オブジェクトグラフスティーブンさんのコメントによります。コンテナとインターフェイスを使用しないでください。

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

私はあなたが達成しようとしていることを理解していません。あなたの質問を更新して、あなたのオブジェクトグラフがどのように見えるかの例を示すことができますか? (例:[this blog post](http://blog.ploeh.dk/2012/11/06/WhentouseaDIContainer)の例のように)コンテナなしでグラフを新しくする方法を示すことでこれを行うことができます/))。 – Steven

答えて

-2

デコーダのstatic配列を作成し、ChannelContextインスタンスに渡します。 依存性注入を使用することを検討してください。

+0

あなたの答えは非常に広いです。もっと具体的にすることは可能でしょうか。質問者の特定の問題を解決するためにこれがどのように機能するのかを示すコードサンプルがありますか? –

関連する問題