如何通过约定将Ninject中的多通用具体类型的通用接口绑定

时间:2014-12-19 09:20:36

标签: c# generics ninject ninject-extensions

我有一个实现相同通用接口的多个对象。所以,我想使用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>

1 个答案:

答案 0 :(得分:1)

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