2014-12-19 5 views
0

У меня есть несколько объектов, которые реализуют один и тот же общий интерфейс. Поэтому я хочу настроить его с помощью соглашений об использовании Ninject, но я не знаю, как это сделать.Как я могу привязать условным путем общий интерфейс к нескольким родовым конкретным типам в Ninject

Сейчас у меня есть эти регистрации

Bind<IQueryHandler<GetPagedPostsQuery, PagedResult<Post>>>().To<GetPagedPostsQueryHandler>(); 
Bind<IQueryHandler<GetPostByDateQuery, Post>>().To<GetPostByDateQueryHandler>(); 

Я попробовал настоящую Конвенцию,

Kernel.Bind(x => x 
    .FromThisAssembly() 
    .IncludingNonePublicTypes() 
    .SelectAllClasses() 
    .InheritedFrom(typeof(IQueryHandler<,>)) 
    .BindDefaultInterface()); 

Но не регистрирует обработчик запросов.

Возможно ли это сделать с условностями?

** Редактирование ** Классы состоят в следующем

public class GetPagedPostsQueryHandler : IQueryHandler<GetPagedPostsQuery, PagedResult<Post>> 
public class GetPostByDateQueryHandler : IQueryHandler<GetPostByDateQuery, Post> 
+0

Вы можете разместить реализацию (.. ну не совсем только то, что он наследует типы) от 'GetPagedPostsQuery' и' GetPostByDateQueryHandler'? – BatteryBackupUnit

+0

@BatteryBackupUnit Я добавляю информацию, но ответ Фрэнка работает для меня. Спасибо – vfabre

ответ

1

BindDefaultInterface означает, что MyService : IMyService, IWhatever будет связан с IMyService.

Вы должны использовать BindSingleInterface, которая работала мгновенно, когда я попробовал его в единичном испытании:

[TestMethod] 
public void TestMethod2() 
{ 
    var kernel = new StandardKernel(); 

    kernel.Bind(c => c.FromThisAssembly() 
         .IncludingNonePublicTypes() 
         .SelectAllClasses() 
         .InheritedFrom(typeof(IQueryHandler<,>)) 
         .BindSingleInterface()); 

    kernel.TryGet<IQueryHandler<GetPagedPostsQuery,PagedResult<Post>>>() 
     .Should() 
     .NotBeNull(); 
} 
+0

Я согласен, что 'BindSingleInterface' должен работать, но я думаю, что' BindDefaultInterface' также должен был работать - ведь @vfabre придерживается соглашения об именах ('IQueryHandler' ->' XYZQueryHandler'). – BatteryBackupUnit

+0

Отлично! это работает для меня, также отличная идея создать единичный тест, чтобы проверить его. – vfabre

+0

@BatteryBackupUnit Я уже тестирую BindDefaultInterface, но ninject не может его решить. Почему я не понимаю. Но благодаря – vfabre