タイトルは誤解を招く可能性がありますが、基本的には、実行時に型(インターフェイスを実装するクラスの型) が指定されている(同じインターフェイスの複数の実装が登録されている)インターフェイスの特定の実装DryIoc.Container
を解決したいと考えています。実装を解決するコードは次のようなことを行うことが期待されているため、実装を識別するために使用することはできません: 必要な実装を取得します (実装のタイプは、実行時に読み取る構成を介して取得されます)。serviceKey
container.Resolve<IService>(*** here specify the runtime type of the implementation ***)
using System;
using DryIoc;
namespace DryIoc_example
{
interface IService { }
class ServiceImpl_1 : IService { }
class ServiceImpl_2 : IService { }
class Program
{
static void Main(string[] args)
{
var container = new Container();
// register my implementations of IService
// this could be done at runtime using
// container.Register(typeof(IService), typeof(ServiceImpl_1));
container.Register<IService, ServiceImpl_1>();
container.Register<IService, ServiceImpl_2>();
// now, i want the container to resolve a specific
// implementation of IService ( ServiceImpl_2 in this case)
// this line doesn't work and throws
var myService = container.Resolve<IService>(typeof(ServiceImpl_2));
// this line is expected to print the type of ServiceImpl_2
Console.WriteLine(myService.GetType());
}
}
}
`
上記のコードは次をスローします。
Unable to resolve DryIoc_example.IService {RequiredServiceType=DryIoc_example.ServiceImpl_2}
Where CurrentScope: null
and ResolutionScope: null
and Found registrations:
DefaultKey.Of(0),{ID=20, ImplType=DryIoc_example.ServiceImpl_1}}
DefaultKey.Of(1),{ID=21, ImplType=DryIoc_example.ServiceImpl_2}}
インターフェイスの登録済みのすべての実装を取得し、必要な実装を持つ実装をフィルタリングできることはわかっています ( DryIoc のメンテナーによるこの応答https://stackoverflow.com/a/37069854/5767019に似たコードを使用)。コンテナに依頼したときにコンテナに解決させる方法がわかりませんでした。