首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DryIoc ScopedTo现在是否包含父作用域?

DryIoc ScopedTo现在是否包含父作用域?
EN

Stack Overflow用户
提问于 2020-07-14 04:32:32
回答 1查看 321关注 0票数 1

下面的代码可以在DryIoc 2.x中运行。我刚刚更新到了4.x。代码不再工作(参见下面的异常)。看起来,4.x将"ScopedTo“数据视为非独占数据,而在2.x中,它们是作用域独占的--它们不适用于其他作用域。现在我如何获得2.x的行为?异常列出了几种补救措施,但是哪种补救措施与2.x行为相匹配?

代码语言:javascript
复制
using System;
using DryIoc;

namespace TestDryIoc
{
    public interface IDep {}

    public interface IOwner
    {
        IDep Dep { get; }
    }
    
    public class Dep1: IDep {}
    public class Dep2: IDep {}

    public class Owner1: IOwner
    {
        public Owner1(IDep dep)
        {
            Dep = dep;
        }
        
        public IDep Dep { get; }
    }

    public class Owner2: IOwner
    {
        public Owner2(IDep dep)
        {
            Dep = dep;
        }
        
        public IDep Dep { get; }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var container = new Container();
            container.Register<IDep, Dep1>(Reuse.InResolutionScopeOf<Owner1>());
            container.Register<IDep, Dep2>(Reuse.InResolutionScopeOf<Owner2>());
            
            container.RegisterMany<Owner1>(Reuse.Singleton, setup: Setup.With(openResolutionScope: true));
            container.RegisterMany<Owner2>(Reuse.Singleton, setup: Setup.With(openResolutionScope: true));

            container.Resolve<Owner2>();
        }
    }
}

我在v4.2.3中得到的异常:

代码语言:javascript
复制
DryIoc.ContainerException: code: ExpectedSingleDefaultFactory; message: Expecting single default registration but found many:
(DefaultKey(0), {FactoryID=144, ImplType=TestDryIoc.Dep1, Reuse=Scoped {Name={ServiceType=TestDryIoc.Owner1}, Lifespan=100}}), 
(DefaultKey(1), {FactoryID=145, ImplType=TestDryIoc.Dep2, Reuse=Scoped {Name={ServiceType=TestDryIoc.Owner2}, Lifespan=100}, AsResolutionCall})
when resolving Resolution call dependency TestDryIoc.IDep (IsSingletonOrDependencyOfSingleton, IsResolutionCall)
  in Resolution root Singleton TestDryIoc.Owner2 FactoryId=147 (IsSingletonOrDependencyOfSingleton, IsResolutionCall)
  from container without scope.
Please identify service with key, or metadata, or use Rules.WithFactorySelector to specify single registered factory.
  at DryIoc.Throw.It(Int32 error, Object arg0, Object arg1, Object arg2, Object arg3) in /_/src/DryIoc/Container.cs:12902
  at DryIoc.Container.DryIoc.IContainer.GetServiceFactoryOrDefault(Request request) in /_/src/DryIoc/Container.cs:1217
  at DryIoc.Container.DryIoc.IContainer.ResolveFactory(Request request) in /_/src/DryIoc/Container.cs:1039
  at DryIoc.Container.ResolveAndCacheKeyed(Int32 serviceTypeHash, Type serviceType, Object serviceKey, IfUnresolved ifUnresolved, Object scopeName, Type requiredServiceType, Request preResolveParent, Object[] args) in /_/src/DryIoc/Container.cs:468
  at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, Object serviceKey, IfUnresolved ifUnresolved, Type requiredServiceType, Request preResolveParent, Object[] args) in /_/src/DryIoc/Container.cs:427
  at DryIoc.Interpreter.InterpretResolveMethod(IResolverContext resolver, IList`1 callArgs, Object paramExprs, Object paramValues, ParentLambdaArgs parentArgs, Boolean useFec, Object& result) in /_/src/DryIoc/Container.cs:3502
  at DryIoc.Interpreter.TryInterpretMethodCall(IResolverContext r, Expression expr, Object paramExprs, Object paramValues, ParentLambdaArgs parentArgs, Boolean useFec, Object& result) in /_/src/DryIoc/Container.cs:3386
  at DryIoc.Interpreter.TryInterpret(IResolverContext r, Expression expr, Object paramExprs, Object paramValues, ParentLambdaArgs parentArgs, Boolean useFec, Object& result) in /_/src/DryIoc/Container.cs:2915
  at DryIoc.Interpreter.TryInterpret(IResolverContext r, Expression expr, Object paramExprs, Object paramValues, ParentLambdaArgs parentArgs, Boolean useFec, Object& result) in /_/src/DryIoc/Container.cs:2818
  at DryIoc.Interpreter.TryInterpretAndUnwrapContainerException(IResolverContext r, Expression expr, Boolean useFec, Object& result) in /_/src/DryIoc/Container.cs:2753
  at DryIoc.Factory.ApplyReuse(Expression serviceExpr, Request request) in /_/src/DryIoc/Container.cs:9825
  at DryIoc.Factory.GetExpressionOrDefault(Request request) in /_/src/DryIoc/Container.cs:9734
  at DryIoc.Container.ResolveAndCacheKeyed(Int32 serviceTypeHash, Type serviceType, Object serviceKey, IfUnresolved ifUnresolved, Object scopeName, Type requiredServiceType, Request preResolveParent, Object[] args) in /_/src/DryIoc/Container.cs:499
  at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, Object serviceKey, IfUnresolved ifUnresolved, Type requiredServiceType, Request preResolveParent, Object[] args) in /_/src/DryIoc/Container.cs:427
  at DryIoc.Interpreter.InterpretResolveMethod(IResolverContext resolver, IList`1 callArgs, Object paramExprs, Object paramValues, ParentLambdaArgs parentArgs, Boolean useFec, Object& result) in /_/src/DryIoc/Container.cs:3502
  at DryIoc.Interpreter.TryInterpretMethodCall(IResolverContext r, Expression expr, Object paramExprs, Object paramValues, ParentLambdaArgs parentArgs, Boolean useFec, Object& result) in /_/src/DryIoc/Container.cs:3386
  at DryIoc.Interpreter.TryInterpret(IResolverContext r, Expression expr, Object paramExprs, Object paramValues, ParentLambdaArgs parentArgs, Boolean useFec, Object& result) in /_/src/DryIoc/Container.cs:2915
  at DryIoc.Interpreter.TryInterpretAndUnwrapContainerException(IResolverContext r, Expression expr, Boolean useFec, Object& result) in /_/src/DryIoc/Container.cs:2753
  at DryIoc.Container.ResolveAndCache(Int32 serviceTypeHash, Type serviceType, IfUnresolved ifUnresolved) in /_/src/DryIoc/Container.cs:406
  at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, IfUnresolved ifUnresolved) in /_/src/DryIoc/Container.cs:353
  at DryIoc.Resolver.Resolve[TService](IResolver resolver, IfUnresolved ifUnresolved) in /_/src/DryIoc/Container.cs:7580
  at TestDryIoc.Program.Main(String[] args) in ```
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-14 16:15:31

看起来像是个窃听器。我已经在DryIoc存储库https://github.com/dadhi/DryIoc/issues/290中创建了相应的问题。请把讨论移到那里。

只有使用Reuse.Singleton父服务时才会出现此问题。因此,在问题得到解决之前,解决方法可能是更改Owner重用或插入人工作用域,以便为这些服务扮演单例的角色。

更新

在NuGet https://github.com/dadhi/DryIoc/releases/tag/v4.2.4上发布了带修复的DryIoc v4.2.4

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62883828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档