3

私はユニティを使用しています。通常のオープンジェネリック型を登録できます。ただし、この場合、インターフェイスには、1 つのステップ内にネストされたオープン ジェネリックがあります。

この種のものを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>>>();
    }
}
4

1 に答える 1

2

ショットの答え - それは不可能です :) 私はこの問題を調査するのに数時間を費やしましたが、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>>>();
于 2015-08-13T15:28:07.280 に答える