Ninject:同一个班级可以使用多个匹配的绑定

时间:2017-12-26 21:43:48

标签: c# asp.net-mvc asp.net-web-api ninject ninject-conventions

鉴于此课程:

public class UserQueryHandler : 
    IQueryHandler<UserCredentialsByUsernameQuery, UserJWTIdentity>,
    IQueryHandlerAsync<UserRoleByUserNameQuery, UserRole>
{

// ..实施 }

public interface IQueryHandler<TParameter, TResult>
{
    TResult Retrieve(TParameter query);
}
public interface IQueryHandlerAsync<TParameter, TResult>
{
    Task<TResult> RetrieveAsync(TParameter query);
}

以下Ninject配置:

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

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

我收到以下错误:

  

可以使用多个匹配的绑定。

     

匹配绑定:

     

1)来自IQueryHandlerAsync的绑定{UserRoleByUserNameQuery,   UserRole}到UserQueryHandler

     

2)来自IQueryHandlerAsync的绑定{UserRoleByUserNameQuery,   UserRole}到UserQueryHandler

     

激活路径:

     

1)请求IQueryHandlerAsync {UserRoleByUserNameQuery,UserRole}

尝试使用此实例获取实例时:

var handler = _kernel.Get<IQueryHandlerAsync<UserRoleByUserNameQuery, UserRole>>();

可疑的是,我没有尝试实例化其他接口实现时出错:

var handler = _kernel.Get<IQueryHandler<UserCredentialsByUsernameQuery, UserJWTIdentity>>();

如果我创建一个仅实现该接口的分离类,则错误消失:

public class UserQueryHandler2 : 
    IQueryHandlerAsync<UserRoleByUserNameQuery, UserRole>
{
//..implementation works fine!! }

根据我的理解,课程被绑定了两次,但我不明白为什么会发生这种情况(可能是个错误?)

1 个答案:

答案 0 :(得分:0)

BindAllInterfaces绑定了类型继承的所有接口,在UserQueryHandler的情况下,IQueryHandlerIQueryHandlerAsync都是绑定的。因此,当您扫描从IQueryHandlerAsync继承的所有类型时,您的类型将在Ninject配置的第一部分中绑定到IQueryHandler