【问题标题】:Inject same instance based on context in Simple Injector在 Simple Injector 中基于上下文注入相同的实例
【发布时间】:2016-12-18 11:37:03
【问题描述】:

我正在尝试根据某些条件将相同的实例注入到一些对象中,并将另一个实例注入到另一个对象列表中。

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);
    }
}

【问题讨论】:

  • 试试依赖注入?
  • 如何创建 ChannelContext 实例?
  • 我不明白你想要达到什么目的。您能否更新您的问题并展示您的对象图应该是什么样子的示例。或者例如,您可以通过在没有容器的情况下显示 new 在图形上的方式来做到这一点(例如 this blog post 中的示例)。
  • @Steven,我已根据您的评论进行了更新。也许我应该改变我的班级结构?
  • 我认为在您的情况下,最好手动连接应用程序的这一部分。我会将代码保留在您的Program.Main 中,并仅在容器中注册您的NetworkManager,以便将其注入其他类。

标签: c# .net dependency-injection ioc-container simple-injector


【解决方案1】:

创建static 解码器数组并将它们传递给您的ChannelContext 实例。考虑使用依赖注入

【讨论】:

  • 您的回答非常广泛。是否可以更具体一些,也许用代码示例说明这将如何解决提问者的特定问题?
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多