c# - 在 Ninject 3.0 中绑定(bind)泛型类型

标签 c# .net generics ninject ioc-container

我希望 Ninject 为实现通用接口(interface)的特定程序集中的所有类型创建绑定(bind),而不是在运行时指定它们。有点像开放泛型在 Autofac 中的工作方式。

这就是我想出的...

kernel.Bind(x => x.FromThisAssembly()
    .SelectAllClasses()
    .Where(t => t.IsAssignableFrom(
        typeof(ICommandHandler<>)))
        .BindAllInterfaces());

调用下面的方法,我希望所有类型的数组实现 ICommandHandler<T>但它什么也没产生...

public void Process<TCommand>(TCommand command) 
    where TCommand : ICommand
{
    var handlers = 
        _kernel.GetAll<ICommandHandler<TCommand>>();

    foreach(var handler in handlers)
    {
        handler.Handle(command);
    }
}

是否有现成的方法来实现这一点?或者我是否需要使用约定 API 自己推出?

这似乎是一种相当常见的模式,我想知道是否可以在不编写自己的实现的情况下实现这一点。

最佳答案

由于两个问题,您的绑定(bind)完全没有执行任何操作:

  1. IsAssignableFrom 需要相反顺序的参数。你指定

    SomeCommand x = new ICommand<>();
    
  2. 封闭泛型类不能分配给开放泛型类型。或者换句话说

    ICommand<> x = new SomeCommand(); 
    

    不是有效代码。

你想要的是:

kernel.Bind(x => x.FromThisAssembly()
                  .SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>))
                  .BindAllInterfaces());

关于c# - 在 Ninject 3.0 中绑定(bind)泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11702477/

相关文章:

c# - 如何在较长的 Storyboard 中的 DoubleAnimation 末尾调用回调?

c# - 泛型:类型 'Camera' 不能用作泛型类型中的类型参数 'T'

c# - 使用程序集中的 Web 应用程序版本号 (ASP.NET/C#)

c# - 使用运行时确定的类型参数调用泛型函数

Java 泛型 : Special usage <T extends Object & Interface>

C# 和从另一个进程读取声音?

c# - 有没有办法使用纯 .NET Framework 生成 DSA 证书,如果没有,为什么?

c# - 像这样使用嵌套的 Try..Catch block 不好吗?

java - .net 和 java 之间通信的最佳方式

java - 使用泛型在 Java 中编码类型约束