Ninject:两个匹配的绑定可以在同一个类中使用两次

问题描述 投票:0回答:1

鉴于此类:

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

//..implementation }

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 {UserSByUserNameQuery,User Role}绑定到UserQuery Handler

2)从IQueryHandlerAsync {UserSByUserNameQuery,User Role}绑定到UserQuery Handler

激活路径:

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!! }

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

c# asp.net-mvc asp.net-web-api ninject ninject-conventions
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.