Ninject: два и более подходящих привязки доступны в одном классе дважды
Учитывая этот класс:
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 ответ
BindAllInterfaces
связывает все интерфейсы, от которых наследуется тип, который в случае UserQueryHandler
это оба IQueryHandler
а также IQueryHandlerAsync
, Так что ваш тип связан с IQueryHandlerAsync
в первой части конфигурации Ninject при сканировании всех типов, которые наследуются от IQueryHandler
,