アップデート:
このコードを有効にするための修正は、DryIoc 2.8.4以降で利用できます。
古い答え:
最新バージョン 2.8.3 の DryIoc は、オープン ジェネリック タイプでの解決スコープの再利用の指定をサポートしていません。そのようにReuse.InResolutionScopeOf(typeof(IAsyncRequestHandler<,>)
。
具体的な閉じた型として指定するとうまくいきます。以下のサンプルを確認してください ( live ):
using System;
using DryIoc;
public class Program
{
public static void Main()
{
var c = new Container();
c.Register<IActionHandler, SomeActionHandler>();
c.Register<IAsyncRequestHandler<string, string>, SomeRequestHandler>();
// works with closed-generic spec.
c.Register<DbContext, Model1>(reuse: Reuse.InResolutionScopeOf(typeof(IAsyncRequestHandler<string, string>)));
// Error: not working with open-generic type in reuse spec
// c.Register<DbContext, Model1>(reuse: Reuse.InResolutionScopeOf(typeof(IAsyncRequestHandler<,>)));
c.Register(typeof(IAsyncRequestHandler<,>), typeof(Decorator<,>), setup: Setup.Decorator);
var result = c.Resolve<IAsyncRequestHandler<string, string>>();
Console.WriteLine("decorator: " + result);
Console.WriteLine("decorator.DbContext is the same as action handler's: " +
(result.DbContext == ((Decorator<string, string>)result).ActionHandler.DbContext));
}
public interface IAsyncRequestHandler<TRequest, TResponse>
{
DbContext DbContext { get; }
}
public interface IActionHandler
{
DbContext DbContext { get; }
}
public class DbContext {}
public class Model1 : DbContext {}
public class Decorator<TRequest, TResponse> : IAsyncRequestHandler<TRequest, TResponse>
{
public DbContext DbContext { get { return _decorated.DbContext; } }
IAsyncRequestHandler<TRequest, TResponse> _decorated;
public readonly IActionHandler ActionHandler;
public Decorator(IActionHandler handler, IAsyncRequestHandler<TRequest, TResponse> inner)
{
ActionHandler = handler;
_decorated = inner;
}
}
public class SomeRequestHandler : IAsyncRequestHandler<string, string>
{
public DbContext DbContext { get; private set; }
public SomeRequestHandler(DbContext dbContext)
{
DbContext = dbContext;
}
}
public class SomeActionHandler : IActionHandler
{
public DbContext DbContext { get; private set; }
public SomeActionHandler(DbContext context)
{
DbContext = context;
}
}
}
次のバージョンにサポートを追加するイシューを作成しました。
別の方法として、次のようにタイプのないキーを使用することもできます。
container.Register<DbContext, Model1>(reuse: Reuse.InResolutionScopeOf(serviceKey: blah));
IAsyncRequestHandler
ただし、キーも登録する必要があります。