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