C# Ninject-请求范围已被释放

C# Ninject-请求范围已被释放,c#,asp.net-mvc,ninject,ninject.web.mvc,ninject-extensions,C#,Asp.net Mvc,Ninject,Ninject.web.mvc,Ninject Extensions,我正在MVC 3应用程序中使用Ninject和扩展EventBroker和DependencyCreation。我已经安装并正在使用Ninject.MVC3软件包,因此使用了OnePerRequestModule 我正在尝试将名为IParentService的服务注入控制器IParentService依赖于通过DependencyCreation扩展创建的ChildService(无硬引用) 这两个服务都在本地事件代理实例(本地到ParentService)上注册 我希望IParentServi

我正在MVC 3应用程序中使用
Ninject
和扩展EventBroker和DependencyCreation。我已经安装并正在使用Ninject.MVC3软件包,因此使用了
OnePerRequestModule

我正在尝试将名为
IParentService
的服务注入控制器
IParentService
依赖于通过DependencyCreation扩展创建的
ChildService
(无硬引用)

这两个服务都在本地事件代理实例(本地到
ParentService
)上注册

我希望
IParentService
根据请求确定作用域,并且我希望依赖项和事件代理与
IParentService
同时被处置,但是,我得到了一个
ScopeDisposedException
我做错了什么?

一些代码:

服务定义:

public interface IParentService
{
}

public class ParentService : IParentService
{
    [EventPublication("topic://ParentService/MyEvent")]
    public event EventHandler<EventArgs> MyEvent;
}

public class ChildService
{
    [EventSubscription("topic://ParentService/MyEvent", typeof(bbv.Common.EventBroker.Handlers.Publisher))]
    public void OnMyEvent(object sender, EventArgs eventArgs)
    {            
    }
}
[ScopeDisposedException: The requested scope has already been disposed.]
   Ninject.Extensions.NamedScope.NamedScopeExtensionMethods.GetScope(IContext context, String scopeParameterName) in c:\Projects\Ninject\ninject.extensions.namedscope\src\Ninject.Extensions.NamedScope\NamedScopeExtensionMethods.cs:118
   Ninject.Extensions.NamedScope.NamedScopeExtensionMethods.GetScope(IContext context, String scopeParameterName) in c:\Projects\Ninject\ninject.extensions.namedscope\src\Ninject.Extensions.NamedScope\NamedScopeExtensionMethods.cs:126
   Ninject.Extensions.NamedScope.<>c__DisplayClass1`1.<InNamedScope>b__0(IContext context) in c:\Projects\Ninject\ninject.extensions.namedscope\src\Ninject.Extensions.NamedScope\NamedScopeExtensionMethods.cs:40
   Ninject.Planning.Bindings.BindingConfiguration.GetScope(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Bindings\BindingConfiguration.cs:119
   Ninject.Planning.Bindings.Binding.GetScope(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Bindings\Binding.cs:224
   Ninject.Activation.Context.GetScope() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:123
   Ninject.Activation.Caching.Cache.TryGet(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Caching\Cache.cs:110
   Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:150
   Ninject.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:386
   System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +145
   System.Linq.<CastIterator>d__b1`1.MoveNext() +85
   System.Linq.Enumerable.Single(IEnumerable`1 source) +191
   Ninject.ResolutionExtensions.Get(IResolutionRoot root, String name, IParameter[] parameters) in c:\Projects\Ninject\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:50
   Ninject.Extensions.ContextPreservation.ContextPreservationExtensionMethods.ContextPreservingGet(IContext context, String name, IParameter[] parameters) in c:\Projects\Ninject\ninject.extensions.contextpreservation\src\Ninject.Extensions.ContextPreservation\ContextPreservationExtensionMethods.cs:56
   Ninject.Extensions.bbvEventBroker.<>c__DisplayClass2`1.<RegisterOnEventBroker>b__0(IContext ctx, T instance) in c:\Projects\Ninject\ninject.extensions.bbveventbroker\src\Ninject.Extensions.bbvEventBroker\EventBrokerExtensionMethods.cs:45
   Ninject.Planning.Bindings.<>c__DisplayClass29`1.<OnDeactivation>b__28(IContext context, Object instance) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Bindings\BindingConfigurationBuilder.cs:513
   Ninject.Activation.Strategies.<>c__DisplayClass4.<Deactivate>b__3(Action`2 action) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Strategies\BindingActionStrategy.cs:42
   Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.cs:32
   Ninject.Activation.Strategies.BindingActionStrategy.Deactivate(IContext context, InstanceReference reference) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Strategies\BindingActionStrategy.cs:42
   Ninject.Activation.<>c__DisplayClass6.<Deactivate>b__4(IActivationStrategy s) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Pipeline.cs:72
   Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.cs:32
   Ninject.Activation.Pipeline.Deactivate(IContext context, InstanceReference reference) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Pipeline.cs:72
   Ninject.Activation.Caching.Cache.Forget(CacheEntry entry) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Caching\Cache.cs:253
   Ninject.Activation.Caching.Cache.Forget(IEnumerable`1 cacheEntries) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Caching\Cache.cs:242
   Ninject.Activation.Caching.Cache.Clear(Object scope) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Caching\Cache.cs:197
   Ninject.Web.Common.<>c__DisplayClass2.<DeactivateInstancesForCurrentHttpRequest>b__1(IKernel kernel) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\OnePerRequestHttpModule.cs:74
   Ninject.GlobalKernelRegistration.MapKernels(Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\GlobalKernelRegistration.cs:75
   Ninject.Web.Common.OnePerRequestHttpModule.DeactivateInstancesForCurrentHttpRequest() in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\OnePerRequestHttpModule.cs:74
   Ninject.Web.Common.OnePerRequestHttpModule.<Init>b__0(Object o, EventArgs e) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\OnePerRequestHttpModule.cs:56
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69
公共接口IParentService { } 公共类父服务:IParentService { [EventPublication(”topic://ParentService/MyEvent")] 公共事件事件处理程序; } 公营儿童服务 { [EventSubscription(”topic://ParentService/MyEvent,typeof(bbv.Common.EventBroker.Handlers.Publisher))] OnMyEvent上的公共void(对象发送方,EventArgs EventArgs) { } } 内核注册(NinjectWebCommon)

私有静态无效注册服务(IKernel内核)
{
kernel.Bind()到()
.InRequestScope()
.OwnsEventBroker(“ParentServiceBroker”)
.RegisterOnEventBroker(“ParentServiceBroker”);
definedependence();
kernel.Bind().ToSelf()
.wheninjectedto()
.InDependencyCreatorScope()
.RegisterOnEventBroker(“ParentServiceBroker”);
}  
堆栈跟踪:

public interface IParentService
{
}

public class ParentService : IParentService
{
    [EventPublication("topic://ParentService/MyEvent")]
    public event EventHandler<EventArgs> MyEvent;
}

public class ChildService
{
    [EventSubscription("topic://ParentService/MyEvent", typeof(bbv.Common.EventBroker.Handlers.Publisher))]
    public void OnMyEvent(object sender, EventArgs eventArgs)
    {            
    }
}
[ScopeDisposedException: The requested scope has already been disposed.]
   Ninject.Extensions.NamedScope.NamedScopeExtensionMethods.GetScope(IContext context, String scopeParameterName) in c:\Projects\Ninject\ninject.extensions.namedscope\src\Ninject.Extensions.NamedScope\NamedScopeExtensionMethods.cs:118
   Ninject.Extensions.NamedScope.NamedScopeExtensionMethods.GetScope(IContext context, String scopeParameterName) in c:\Projects\Ninject\ninject.extensions.namedscope\src\Ninject.Extensions.NamedScope\NamedScopeExtensionMethods.cs:126
   Ninject.Extensions.NamedScope.<>c__DisplayClass1`1.<InNamedScope>b__0(IContext context) in c:\Projects\Ninject\ninject.extensions.namedscope\src\Ninject.Extensions.NamedScope\NamedScopeExtensionMethods.cs:40
   Ninject.Planning.Bindings.BindingConfiguration.GetScope(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Bindings\BindingConfiguration.cs:119
   Ninject.Planning.Bindings.Binding.GetScope(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Bindings\Binding.cs:224
   Ninject.Activation.Context.GetScope() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:123
   Ninject.Activation.Caching.Cache.TryGet(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Caching\Cache.cs:110
   Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:150
   Ninject.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:386
   System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +145
   System.Linq.<CastIterator>d__b1`1.MoveNext() +85
   System.Linq.Enumerable.Single(IEnumerable`1 source) +191
   Ninject.ResolutionExtensions.Get(IResolutionRoot root, String name, IParameter[] parameters) in c:\Projects\Ninject\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:50
   Ninject.Extensions.ContextPreservation.ContextPreservationExtensionMethods.ContextPreservingGet(IContext context, String name, IParameter[] parameters) in c:\Projects\Ninject\ninject.extensions.contextpreservation\src\Ninject.Extensions.ContextPreservation\ContextPreservationExtensionMethods.cs:56
   Ninject.Extensions.bbvEventBroker.<>c__DisplayClass2`1.<RegisterOnEventBroker>b__0(IContext ctx, T instance) in c:\Projects\Ninject\ninject.extensions.bbveventbroker\src\Ninject.Extensions.bbvEventBroker\EventBrokerExtensionMethods.cs:45
   Ninject.Planning.Bindings.<>c__DisplayClass29`1.<OnDeactivation>b__28(IContext context, Object instance) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Bindings\BindingConfigurationBuilder.cs:513
   Ninject.Activation.Strategies.<>c__DisplayClass4.<Deactivate>b__3(Action`2 action) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Strategies\BindingActionStrategy.cs:42
   Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.cs:32
   Ninject.Activation.Strategies.BindingActionStrategy.Deactivate(IContext context, InstanceReference reference) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Strategies\BindingActionStrategy.cs:42
   Ninject.Activation.<>c__DisplayClass6.<Deactivate>b__4(IActivationStrategy s) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Pipeline.cs:72
   Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.cs:32
   Ninject.Activation.Pipeline.Deactivate(IContext context, InstanceReference reference) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Pipeline.cs:72
   Ninject.Activation.Caching.Cache.Forget(CacheEntry entry) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Caching\Cache.cs:253
   Ninject.Activation.Caching.Cache.Forget(IEnumerable`1 cacheEntries) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Caching\Cache.cs:242
   Ninject.Activation.Caching.Cache.Clear(Object scope) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Caching\Cache.cs:197
   Ninject.Web.Common.<>c__DisplayClass2.<DeactivateInstancesForCurrentHttpRequest>b__1(IKernel kernel) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\OnePerRequestHttpModule.cs:74
   Ninject.GlobalKernelRegistration.MapKernels(Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\GlobalKernelRegistration.cs:75
   Ninject.Web.Common.OnePerRequestHttpModule.DeactivateInstancesForCurrentHttpRequest() in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\OnePerRequestHttpModule.cs:74
   Ninject.Web.Common.OnePerRequestHttpModule.<Init>b__0(Object o, EventArgs e) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\OnePerRequestHttpModule.cs:56
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69
[ScopeDisposedException:请求的作用域已被释放。]
c:\Projects\Ninject\Ninject.Extensions.NamedScope\src\Ninject.Extensions.NamedScope\NamedScope\NamedScopeExtensionMethods.GetScope(IContext上下文,字符串scopeParameterName)中的Ninject.Extensions.NamedScope\src\Ninject.Extensions.NamedScope\NamedScopeExtensionMethods.cs:118
c:\Projects\Ninject\Ninject.Extensions.NamedScope\src\Ninject.Extensions.NamedScope\NamedScope\NamedScopeExtensionMethods.GetScope(IContext上下文,字符串scopeParameterName)中的Ninject.Extensions.NamedScope\NamedScope\NamedScopeExtensionMethods.cs:126
c:\Projects\Ninject\Ninject.Extensions.NamedScope\src\Ninject.Extensions.NamedScope.NamedScope\NamedScope\NamedScopeExtensionMethods.cs:40中的Ninject.Extensions.NamedScope.c\uu显示Class1`1.b\u0(IContextext上下文)
c:\Projects\Ninject\Ninject\src\Ninject\Planning\Bindings\BindingConfiguration.cs:119中的Ninject.Planning.Bindings.BindingConfiguration.GetScope(IContext上下文)
c:\Projects\Ninject\Ninject\src\Ninject\Planning\Bindings\Binding.cs:224中的Ninject.Planning.Bindings.Binding.GetScope(IContext上下文)
c:\Projects\Ninject\Ninject\src\Ninject\Activation\Context.cs:123中的Ninject.Activation.Context.GetScope()
c:\Projects\Ninject\Ninject\src\Ninject\Activation\Caching\Cache.cs:110中的Ninject.Activation.Caching.Cache.TryGet(IContext上下文)
c:\Projects\Ninject\Ninject\src\Ninject\Activation\Context.cs:150中的Ninject.Activation.Context.Resolve()
c:\Projects\Ninject\Ninject\src\Ninject\KernelBase.cs:386中的Ninject.c\uu显示Class10.b\u c(IBinding绑定)
System.Linq.whereSelectEnumerableInterator`2.MoveNext()+145
System.Linq.d_uB1`1.MoveNext()+85
System.Linq.Enumerable.Single(IEnumerable`1源)+191
c:\Projects\Ninject\Ninject\src\Ninject\Syntax\ResolutionExtensions.cs:50中的Ninject.ResolutionExtensions.Get(IResolutionRoot根,字符串名,IPParameter[]参数)
c:\Projects\Ninject\Ninject.Extensions.ContextPreservationExtensionMethods.ContextPreservingGet(IContext上下文,字符串名称,IParameter[]参数)中的Ninject.Extensions.ContextPreservation\src\Ninject.Extensions.ContextPreservation\ContextPreservationExtensionMethods.cs:56
Ninject.Extensions.bbvEventBroker.c_u在c:\Projects\Ninject\Ninject.Extensions.bbvEventBroker\src\Ninject.Extensions.bbvEventBroker\EventBrokerExtensionMethods.cs中显示Class2`1.b_u0(IContext ctx,T实例)
Ninject.Planning.Bindings.c__在c:\Projects\Ninject\Ninject\src\Ninject\Planning\Bindings\BindingConfigurationBuilder.cs:513中显示Class29`1.b__28(IContext上下文,对象实例)
Ninject.Activation.Strategies.c___在c:\Projects\Ninject\Ninject\src\Ninject\Activation\Strategies\BindingActionStrategy.cs:42中显示class4.b__3(Action`2 Action)
c:\Projects\Ninject\Ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.Map(IEnumerable`1系列,Action`1 Action)中的Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1系列,Action`1 Action)
c:\Projects\Ninject\Ninject\src\Ninject\Activation\Strategies\BindingActionStrategy.Deactivate(IContext上下文,InstanceReference引用)中的Ninject.Activation.Strategies.BindingActionStrategy.Deactivate(IContext上下文,InstanceReference引用):42
Ninject.Activation.c\uu在c:\Projects\Ninject\Ninject\src\Ninject\Activation\Pipeline.cs中显示class6.b\uu 4(IActivationStrategys):72
c:\Projects\Ninject\Ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.Map(IEnumerable`1系列,Action`1 Action)中的Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1系列,Action`1 Action)
c:\Projects\Ninject\Ninject\src\Ninject\Activation\Pipeline.Deactivate(IContext上下文,InstanceReference引用)中的Ninject.Activation.Pipeline.Deactivate(IContext上下文,InstanceReference引用):72
c:\Projects\Ninject\Ninject\src\Ninject\Activation\Caching\Cache.cs:253中的Ninject.Activation.Caching.Cache.Forget(CacheEntry条目)
c:\Projects\Ninject\Ninject\src\Ninject\Activation\Caching\Cache.cs:242中的Ninject.Activation.Caching.Cache.Forget(IEnumerable`1 cacheEntries)
c:\Projects\Ninject\Ninject\src\Ninject\Activation\Caching\Cache.cs:197中的Ninject.Activation.Caching.Cache.Clear(对象范围)
Ninj
 kernel.Bind<ParentService>().ToSelf();
    public static IBindingOnSyntax<T> OwnsEventBroker<T>(this IBindingOnSyntax<T> syntax, string eventBrokerName)
    {
        string namedScopeName = "EventBrokerScope" + eventBrokerName;
        syntax.DefinesNamedScope(namedScopeName);
        syntax.Kernel.Bind<IEventBroker>().To<EventBroker>().InNamedScope(namedScopeName).Named(eventBrokerName);
        syntax.Kernel.Bind<IEventBroker>().ToMethod(ctx => ctx.ContextPreservingGet<IEventBroker>(eventBrokerName)).WhenTargetNamed(eventBrokerName);
        return syntax;
    }
    public static IBindingOnSyntax<T> RegisterOnEventBroker<T>(
        this IBindingOnSyntax<T> syntax, string eventBrokerName)
    {
        return
            syntax.OnActivation((ctx, instance) => ctx.ContextPreservingGet<IEventBroker>(eventBrokerName).Register(instance))
                  .OnDeactivation((ctx, instance) => ctx.ContextPreservingGet<IEventBroker>(eventBrokerName).Unregister(instance));
    }