![](/img/trans.png)
[英]Ninject - Multiple Classes Using Single Interface (more than one matching bindings are available)
[英]Ninject: More than one matching bindings are available same class twice
給定此類:
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 {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!! }
據我了解,該類被綁定了兩次,但是我不明白為什么會發生這種情況(可能是一個錯誤?)
BindAllInterfaces
綁定該類型繼承的所有接口,就UserQueryHandler
,它是IQueryHandler
和IQueryHandlerAsync
。 所以你的類型被綁定到IQueryHandlerAsync
在Ninject配置的第一部分時,它的掃描,從繼承的所有類型IQueryHandler
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.