現在、DryIoc を試すために Prism.DryIoc.Forms プロジェクトの作成に取り組んでいます (初めて!)。
Xamarin.Forms にはネイティブの DependencyService があり、Prism の使用に移行するための優れた方法を提供するために、要求されたサービス タイプをメイン コンテナーから解決できない場合に備えて、フォールバック コンテナーとして追加したいと考えています。
現在、私は を作成しFallbackContainer
、のインスタンスを渡し、IContainer
メソッドをオーバーライドし、作成中に渡されたインスタンスへIResolver
の残りのIContainer
呼び出しを委任します。
したがって、デフォルトのコンテナが作成および構成された後、次のことを行います
Container = CreateContainer();
ConfigureContainer();
Container.Rules.WithFallbackContainer(new DependencyServiceContainer(Container));
これは好ましい方法ですか、それともデフォルトを添付するだけの方法はありますIResolver
か?
現在の実装
public class FallbackDependencyServiceContainer : IContainer
{
private readonly IContainer container;
public FallbackDependencyServiceContainer(IContainer container)
{
this.container = container;
}
public object Resolve(Type serviceType, bool ifUnresolvedReturnDefault)
{
return ResolveFromDependencyService(serviceType);
}
public object Resolve(Type serviceType, object serviceKey, bool ifUnresolvedReturnDefault,
Type requiredServiceType,
RequestInfo preResolveParent, IScope scope)
{
return ResolveFromDependencyService(serviceType);
}
public IEnumerable<object> ResolveMany(Type serviceType, object serviceKey, Type requiredServiceType,
object compositeParentKey,
Type compositeParentRequiredType, RequestInfo preResolveParent, IScope scope)
{
return new[] { ResolveFromDependencyService(serviceType) };
}
private static object ResolveFromDependencyService(Type targetType)
{
if (!targetType.GetTypeInfo().IsInterface)
{
return null;
}
var method = typeof(DependencyService).GetTypeInfo().GetDeclaredMethod("Get");
var genericMethod = method.MakeGenericMethod(targetType);
return genericMethod.Invoke(null, new object[] { DependencyFetchTarget.GlobalInstance });
}
....
}
ありがとう、DryIoc をテストするのを楽しみにしています