2016-09-09 2 views
1

Я пытаюсь использовать LightInject и MediatR для создания общих обработчиков запросов. В принципе, у меня есть типы, как следующее:LightInject не разрешает унаследованные общие типы

public class SomeType { } 
public class InheritedType : SomeType { } 
public class Handler : IAsyncRequestHandler<SomeType, SomeResponseType> { } 

И я зарегистрировал мой Handler типа в мой LightInject контейнер таким образом:

registry.RegisterAssembly(typeof(SomeType).Assembly, (s, type) => 
      !s.IsClass && type.IsAssignableToGenericType(typeof(IAsyncRequestHandler<,>) 
      ); 

Однако, когда я пытаюсь позвонить моему посреднику для реализация IAsyncRequestHandler<InheritedType,SomeResponseType>, он терпит неудачу. Я бы ожидал получить мой зарегистрированный Handler с InheritedType осуществляет SomeType.

Я делаю что-то неправильно здесь, или есть какой-либо способ в LightInject для достижения описанного выше поведения?


Сообщите мне, если это неясно, и я могу попытаться предоставить дополнительную информацию. Благодаря!

ответ

2

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

Измените код.

public class Handler<T, SomeResponseType> : IAsyncRequestHandler<T, SomeResponseType> where T:IAsyncRequest<SomeResponseType> 
{ 
    public Task<SomeResponseType> Handle(T message) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Регистрация и решить, как это

var container = new ServiceContainer();    
container.Register(typeof(IAsyncRequestHandler<,>), typeof(Handler<,>)); 
var instance = container.GetInstance<IAsyncRequestHandler<InheritedType, SomeResponseType>>(); 
+0

Я закончил работать aroudn ней другим способом, чтобы избежать дополнительного слоя дженериков, но хорошая информация знать, спасибо! И спасибо за огромную библиотеку! – agc93

Смежные вопросы