2013-10-26 4 views
3

Я использую Unity. Я могу регистрировать обычные открытые типы. Но в этом случае интерфейс имеет открытый общий вложенный один шаг внутри.Регистрация вложенных открытых общих типов в Unity

Есть ли способ зарегистрировать такие вещи с Unity?

class DoSomethingCommandHandler<TModel> : ICommandHandler<DoSomethingCommand<TModel>> 
{ 
    public void Handle(DoSomethingCommand<TModel> cmd) 
    { 
     var model = cmd.Model; 
     //do thing with model 
    } 
} 

class QuickTest 
{ 
    static void Go() 
    { 
     var container = new UnityContainer(); 
     container.RegisterType(
      typeof(ICommandHandler<>).MakeGenericType(typeof(DoSomethingCommand<>)), 
      typeof(DoSomethingCommandHandler<>)); 

     //This blows up: 
     var res = container.Resolve<ICommandHandler<DoSomethingCommand<object>>>(); 
    } 
} 
+0

Может быть, я чего-то не хватает (например, некоторый дополнительный код), но если я попробую: 'ICommandHandler > handler = new DoSo methingCommand (); 'компилятор жалуется, что мне нужен актерский состав. Это ожидалось? –

+0

'DoSomethingCommand' не реализует' ICommandHandler', поэтому ожидается ошибка компилятора. Только 'DoSomethingCommandHandler' реализует' ICommandHandler' – Joel

ответ

2

ответ Shot - это невозможно :) я провел пару часов исследуя эту проблему и не найти способ, чтобы сказать Unity, как это сделать.

Вы должны реализовать еще один интерфейс:

internal interface IDoSomethingCommandCommandHandler<out T> { } 

class DoSomethingCommandHandler<TModel> : ICommandHandler<DoSomethingCommand<TModel>>, IDoSomethingCommandCommandHandler<TModel> 

и зарегистрировать с помощью этого интерфейса:

container.RegisterType(
    typeof(IDoSomethingCommandCommandHandler<>), 
    typeof(DoSomethingCommandHandler<>)); 
var res = container.Resolve<IDoSomethingCommandCommandHandler<object>>(); 

Или явно зарегистрировать для каждого вложенного типа:

var container = new UnityContainer(); 
container.RegisterType(
      typeof(ICommandHandler<>).MakeGenericType(typeof(DoSomethingCommand<object>)), 
      typeof(DoSomethingCommandHandler<object>)); 
var res = container.Resolve<ICommandHandler<DoSomethingCommand<object>>>(); 
Смежные вопросы