创建后备 container/resolver DryIoc

Creating a fallback container/resolver DryIoc

目前正在创建一个 Prism.DryIoc.Forms 项目来试用 DryIoc(第一次!)。

在 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,因为我读过它应该是最快的

更新的答案:

你可以直接使用 WithUnknownServiceResolvers 返回 DelegateFactory:

var c = new Container(Rules.Default.WithUnknownServiceResolvers(request =>
    new DelegateFactory(_ => GetFromDependencyService(request.ServiceType))));

不需要为此实现 IContainer。

我认为可以通过将 DelegateFactory 替换为 ExpressionFactory 来优化性能。但我需要一些时间来研究这个想法。