【问题标题】:Multiple C# Channels, Same type, different names多个 C# 通道,相同类型,不同名称
【发布时间】:2021-07-29 04:27:42
【问题描述】:

在 C# 中使用通道时,我想运行多个具有相同基本类型的通道,但这会导致 DI 出现问题。比如

我想要一个高优先级频道和一个中等优先级频道,两者都是问题类型。所以为 DI 设置它看起来像

services.AddSingleton(channel.CreateUnbounded<Issue>()) // high priority
services.AddSingleton(channel.CreateUnbounded<Issue>()) // normal priority?


public async Task<bool> CreateHighPriorityIssues(Channel<Issue> channel) {}

public async Task<bool> CreateNormalPriorityIssues(Channel<Issue> channel) {}

上面的这个显然行不通,那我如何在不必重构所有基类的情况下进行呢?

我能想到的唯一其他选择是实现某种工厂方法。

【问题讨论】:

  • 所以您希望两个频道同时可用?你期望接收注入依赖的类如何选择正确的通道?
  • 这就是问题所在。我不知道是否有办法做到这一点,而无需全力以赴。希望有类似“命名 HTTP 客户端”或其他解决方法的东西。
  • 不,我不认为这是你的问题。您的问题是如何满足要求。我问你开始的要求是什么。为什么有两个渠道,您如何选择其中之一?例如。你有if 声明吗,比如if (user.Priority == Priority.High) channel = GetHighPriorityChannel()...?
  • 我有 1 个工作人员服务将监视两个通道的事件。如果该通道中有任何事件,它需要首先处理高优先级事件。或者继续处理 Normal 通道。上游数据进入通道的方式由上游服务决定,该服务将查看事件中的属性(所有者、客户端、描述)并自动决定将事件放置在哪个通道上。

标签: c# asp.net-core .net-core channels


【解决方案1】:

根据研究,使用 Microsoft 的内置 DI 框架并没有简单的方法来做到这一点,虽然它易于使用,但功能并不像某些第 3 方 DI 框架那样丰富。

为此,我决定改用 Autofac,这让我可以灵活地通过命名服务调用正确的服务。

https://autofac.readthedocs.io/en/latest/advanced/keyed-services.html

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 2017-10-22
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2016-12-25
    相关资源
    最近更新 更多