【问题标题】:Microsoft Dependency injection and contravarianceMicrosoft 依赖注入和逆变
【发布时间】:2019-07-22 03:52:57
【问题描述】:

我正在将一个库移植到网络核心。我们现在有内置的 DI,我想尽可能地使用它。

我的库代理从后端到信号器客户端的事件,它包含一个框架,用于在将事件发送到特定客户端之前对其进行验证。我的旧库支持逆变,因此如果您愿意,一个事件处理程序可以支持所有事件。考虑一下这个

public class ContravariantHandler : IEventHandler<BaseEvent>
{
    public void Handle(BaseEvent message)
    {

    }
}

public abstract class BaseEvent { }

public class MyEvent : BaseEvent { }
public class MyEvent2 : BaseEvent { }

public interface IEventHandler<in T>
{
    void Handle(T message);
}

new ContravariantHandler().Handle(new MyEvent());new ContravariantHandler().Handle(new MyEvent2()); 在这里都可以。

我可以在这里让网络核心 DI 处理为正确的类型吗?

这不起作用,

var provider = new ServiceCollection()
    .AddTransient<IEventHandler<BaseEvent>, ContravariantHandler>()
    .BuildServiceProvider();

var contravariance =  provider.GetService<IEventHandler<MyEvent>>();

【问题讨论】:

  • 通过在接口定义中指定BaseEvent你已经关闭了泛型,你应该使用开放类型注册:stackoverflow.com/questions/35342472/…
  • 您正在尝试注册一个 open 通用实现。这意味着您必须改用.AddTransient(typeof(IEventHandler&lt;&gt;), typeof(ContravariantHandler))
  • 它没有打开,IEventHandler

标签: c# dependency-injection .net-core polymorphism contravariance


【解决方案1】:

我可以在这里让网络核心 DI 处理为正确的类型吗?

没有任何内置机制,不太可能被添加。

我们了解这种情况,但添加对此的支持会使与其他容器一起工作变得困难。 https://github.com/aspnet/DependencyInjection/issues/453

但是,您可以引入另一个接口,即IEventHandler,解析IEnumerable&lt;IEventHandler&gt; 并检查每个接口的兼容性。缺点是这会导致所有事件处理程序的激活。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2012-02-15
    • 2011-05-11
    • 2011-04-04
    • 2017-03-25
    相关资源
    最近更新 更多