いくつかの条件に基づいて、同じインスタンスをオブジェクトの一部に挿入し、別のインスタンスを別のオブジェクトのリストに挿入しようとしています。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);
}
}
依存性注入を試してみませんか? – mateudu
ChannelContextインスタンスの作成方法は? – lavrik
私はあなたが達成しようとしていることを理解していません。あなたの質問を更新して、あなたのオブジェクトグラフがどのように見えるかの例を示すことができますか? (例:[this blog post](http://blog.ploeh.dk/2012/11/06/WhentouseaDIContainer)の例のように)コンテナなしでグラフを新しくする方法を示すことでこれを行うことができます/))。 – Steven