如何按照惯例将通用接口绑定到 Ninject 中的多个通用具体类型

本文关键字:类型 照惯例 何按 接口 绑定 Ninject | 更新日期: 2023-09-27 18:34:45

我有一个实现相同泛型接口的多对象。所以,我想使用 Ninject 约定来配置它,但我不知道该怎么做。

现在我有这些注册

Bind<IQueryHandler<GetPagedPostsQuery, PagedResult<Post>>>().To<GetPagedPostsQueryHandler>();
Bind<IQueryHandler<GetPostByDateQuery, Post>>().To<GetPostByDateQueryHandler>();

我试过这个约定

Kernel.Bind(x => x
  .FromThisAssembly()
  .IncludingNonePublicTypes()
  .SelectAllClasses()
  .InheritedFrom(typeof(IQueryHandler<,>))
  .BindDefaultInterface());

但不注册任何查询处理程序。

有可能

用约定来做吗?

**编辑**这些类如下

public class GetPagedPostsQueryHandler : IQueryHandler<GetPagedPostsQuery, PagedResult<Post>>
public class GetPostByDateQueryHandler : IQueryHandler<GetPostByDateQuery, Post>

如何按照惯例将通用接口绑定到 Ninject 中的多个通用具体类型

BindDefaultInterface表示MyService : IMyService, IWhatever将绑定到IMyService

你应该使用 BindSingleInterface ,当我在单元测试中尝试它时,它会立即起作用:

[TestMethod]
public void TestMethod2()
{
    var kernel = new StandardKernel();
    kernel.Bind(c => c.FromThisAssembly()
                        .IncludingNonePublicTypes()
                        .SelectAllClasses()
                        .InheritedFrom(typeof(IQueryHandler<,>))
                        .BindSingleInterface());
    kernel.TryGet<IQueryHandler<GetPagedPostsQuery,PagedResult<Post>>>()
        .Should()
        .NotBeNull();
}