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,

Другие вопросы по тегам