【问题标题】:Creating a fallback container/resolver DryIoc创建一个备用容器/解析器 DryIoc
【发布时间】:2016-03-26 03:06:23
【问题描述】:

目前正在创建一个 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,因为我读过它应该是最快的

【问题讨论】:

    标签: dryioc


    【解决方案1】:

    更新答案:

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

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

    无需为此实现 IContainer。

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

    【讨论】:

    • Gah 设法保存了评论,然后延迟了编辑。抱歉。我想在解析时更改行为的唯一一点是 DryIoc 容器是否无法解析请求的服务类型。 DryIoc 容器用于注册所有框架服务以及应用程序特定服务。将用我认为可行但感觉有点做作的当前实现来更新我的问题,因为我只希望后备行为询问 DependencyService.GetService(serviceType) 这是静态的 我觉得很糟糕的解释
    • 不错的一个!感谢您的快速响应
    • DryIoc 是否支持在使用 serviceKey 注册派生类时解析基类?假设类 A : B {} Container.Register(serviceKey: "A"); Container.Resolve("A");谢谢。 (也许这应该是一个新问题。如果更好的话,可以做一个)
    • 设法让它工作是解析基类并使用 Made.Of(() => new TDerived()) 覆盖。但是,如果 TDervied 作为要注入的任何参数,这将失败。有什么建议吗?
    • Container.Resolve(requiredServiceType: typeof(A), serviceKey: "A");最好让它成为未来的新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2020-08-02
    相关资源
    最近更新 更多