鉴于此类:
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!! }
根据我的理解,该课程被绑定两次,但我不明白为什么会发生这种情况(可能是一个错误?)
BindAllInterfaces
绑定了类型继承的所有接口,在UserQueryHandler
的情况下,IQueryHandler
和IQueryHandlerAsync
都是。因此,当您扫描从IQueryHandlerAsync
继承的所有类型时,您的类型将被绑定到Ninject配置的第一部分中的IQueryHandler
。