0

我目前正在尝试使用接口拦截的约定注册。不幸的是,我似乎做错了什么,因为我StackOverflowExceptionUnity.Container.dll第一个解决方案中运行...

这是我尝试过的:

container = new UnityContainer();
container.RegisterTypes(AllClasses.FromAssemblies(Assembly.GetAssembly(typeof(IFoo)), 
  WithMappings.FromMatchingInterface, 
  getInjectionMembers: c => new InjectionMember[] { new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<IBarBehavior>()});

似乎现在所有类都已注册,而不仅仅是具有匹配接口的类(Foo --> IFoo)。没有接口拦截,语句没问题,我的类也按预期注册了。

任何想法或帮助都会很棒!

更新:

我在另一个问题中发现了这篇文章,该问题说明了何时使用 a LifeTimeManagerorinterception行为时,所有类型都已注册。通过使用这些信息,以下代码产生了预期的结果:

container.RegisterTypes(AllClasses.FromAssemblies(Assembly.GetAssembly(typeof(IFoo)).
  Where(t => t.GetTypeInfo().GetInterface("I" + t.Name) != null), 
  WithMappings.FromMatchingInterface,
  getInjectionMembers: c => new InjectionMember[] { new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<IBarBehavior>()});
4

1 回答 1

0

如果我没记错的话,您会因为注入中的循环依赖问题而遇到StackOverflowException 。当您注入许多依赖项时会发生这种情况,比如说您有,

public YourController(IA a, IB b, IC c){  ... }
public ConcreteA(IB b, IC c) { ... }
public ConcreteB(IA a) { ... }

像这样设置的问题是,ConcreteA 需要 ConcreteB (IB),因此它会注入它。在注入 ConcreteB 时,Unity 发现需要 ConcreteA (IA),因此它也注入它,这将继续循环,直到堆栈溢出。

如果您从默认入口点开始跟踪,您会发现一个或多个注入相互依赖,从而导致循环加载依赖项,如上所示。

一旦你消除了这种循环依赖,你会没事的。

于 2017-11-27T18:51:10.033 回答