Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Castle.Windsor.Extensions.DependencyInjection parallelism issues #563

Closed
nativenolde opened this issue Nov 18, 2020 · 24 comments · Fixed by #577
Closed

Castle.Windsor.Extensions.DependencyInjection parallelism issues #563

nativenolde opened this issue Nov 18, 2020 · 24 comments · Fixed by #577
Milestone

Comments

@nativenolde
Copy link
Contributor

nativenolde commented Nov 18, 2020

@ltines @generik0 thank you for contributing the Castle.Windsor.Extensions.DependencyInjection package.
I guess a lot of people are very happy about that!

Since migrating my application to use the ms-di implementation (v5.1), i've noticed some potentially serious issues. They occur when running multiple ASP.NET Core Integration Tests in parallel on independent application instances. It seems some dependencies will be shared respectively disposed across HTTP-Request boundaries. At the moment, i can't say whether this is just a problem when testing or it's affecting production runtime as well.

My reproducible sample, created using Microsoft guidelines
https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests

is attached here
InteractionTesting.zip

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args)
                .Build()
                .Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            return Host.CreateDefaultBuilder(args)
                .UseWindsorContainerServiceProvider()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
        }
    }
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services
                .AddControllersWithViews()
                .AddControllersAsServices();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app)
        {
            app.UseDeveloperExceptionPage();

            app.UseRouting();

            app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); });
        }
    }
    [Route("[controller]")]
    public class DemoController : ControllerBase
    {
        public IActionResult Demo()
        {
            return Ok();
        }
    }

As long as the tests are executed serial they work properly.. but if you run them in parallel, they fail for different reasons.
image
As an example:

2020-11-18 12:56:56 [Debug] Hosting starting
2020-11-18 12:56:56 [Information] User profile is available. Using '"C:\Users\xxx\AppData\Local\ASP.NET\DataProtection-Keys"' as key repository and Windows DPAPI to encrypt keys at rest.
2020-11-18 12:56:56 [Debug] Found key {04f0ed1c-94e8-451e-958f-4a91811712e6}.
2020-11-18 12:56:56 [Debug] Found key {18c67e43-7aa7-42ad-af20-e4c822e82ca7}.
2020-11-18 12:56:56 [Debug] Found key {735d0b36-36d1-4c23-a002-b11d77f2f72e}.
2020-11-18 12:56:56 [Debug] Found key {844a49aa-69e8-4d4a-a7f5-e1df66e6f6d5}.
2020-11-18 12:56:56 [Debug] Found key {a1f9d835-ee2d-4a32-9169-d9660d9b18ff}.
2020-11-18 12:56:56 [Debug] Found key {c612ea1e-d2e2-4615-884d-11445c357eb5}.
2020-11-18 12:56:56 [Debug] Found key {d96d15f6-6878-420a-8384-a14c380f6d24}.
2020-11-18 12:56:56 [Debug] Found key {e0765c4b-4693-408b-9434-75f3058045d1}.
2020-11-18 12:56:56 [Debug] Considering key {a1f9d835-ee2d-4a32-9169-d9660d9b18ff} with expiration date 2021-02-16 11:46:08Z as default key.
2020-11-18 12:56:56 [Debug] Forwarded activator type request from "Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=3.1.9.0, Culture=neutral, PublicKeyToken=adb9793829ddae60" to "Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60"
2020-11-18 12:56:56 [Debug] Decrypting secret element using Windows DPAPI.
2020-11-18 12:56:56 [Debug] Forwarded activator type request from "Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=3.1.9.0, Culture=neutral, PublicKeyToken=adb9793829ddae60" to "Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60"
2020-11-18 12:56:56 [Debug] Opening CNG algorithm '"AES"' from provider 'null' with chaining mode CBC.
2020-11-18 12:56:56 [Debug] Opening CNG algorithm '"SHA256"' from provider 'null' with HMAC.
2020-11-18 12:56:56 [Debug] Using key {a1f9d835-ee2d-4a32-9169-d9660d9b18ff} as the default key.
2020-11-18 12:56:56 [Debug] Key ring with default key {a1f9d835-ee2d-4a32-9169-d9660d9b18ff} was loaded during application startup.
2020-11-18 12:56:56 [Debug] Loaded hosting startup assembly "AmazingApi"
2020-11-18 12:56:56 [Information] Application started. Press Ctrl+C to shut down.
2020-11-18 12:56:56 [Information] Hosting environment: "Production"
2020-11-18 12:56:56 [Information] Content root path: "C:\Users\xxx\source\repos\InteractionTesting\AmazingApi"
2020-11-18 12:56:56 [Debug] Hosting started
2020-11-18 12:56:56 [Information] Request starting HTTP/1.1 GET http://localhost/demo
2020-11-18 12:56:56 [Debug] 1 candidate(s) found for the request path '"/demo"'
2020-11-18 12:56:56 [Debug] Endpoint '"AmazingApi.DemoController.Demo (AmazingApi)"' with route pattern '"Demo"' is valid for the request path '"/demo"'
2020-11-18 12:56:56 [Debug] Request matched endpoint '"AmazingApi.DemoController.Demo (AmazingApi)"'
2020-11-18 12:56:56 [Information] Executing endpoint '"AmazingApi.DemoController.Demo (AmazingApi)"'
2020-11-18 12:56:56 [Debug] Registered model binder providers, in the following order: ["Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BinderTypeModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ServicesModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.HeaderModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FloatingPointTypeModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.EnumTypeModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.SimpleTypeModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.CancellationTokenModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ByteArrayModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormFileModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormCollectionModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.KeyValuePairModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DictionaryModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ArrayModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.CollectionModelBinderProvider", "Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinderProvider"]
2020-11-18 12:56:56 [Information] Executed endpoint '"AmazingApi.DemoController.Demo (AmazingApi)"'
2020-11-18 12:56:56 [Error] An unhandled exception has occurred while executing the request.
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Scope was already disposed. This is most likely a bug in the calling code.'.
   at Castle.MicroKernel.Lifestyle.ScopedLifestyleManager.GetScope(CreationContext context)
   at Castle.MicroKernel.Lifestyle.ScopedLifestyleManager.Resolve(CreationContext context, IReleasePolicy releasePolicy)
   at Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired, Burden& burden)
   at Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext context, Boolean instanceRequired)
   at Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context)
   at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveFromKernelByType(CreationContext context, ComponentModel model, DependencyModel dependency)
   at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveFromKernel(CreationContext context, ComponentModel model, DependencyModel dependency)
   at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.TryResolveCore(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency, Object& value)
   at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateConstructorArguments(ConstructorCandidate constructor, CreationContext context)
   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.Instantiate(CreationContext context)
   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate(CreationContext context)
   at Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create(CreationContext context, Burden burden)
   at Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.CreateInstance(CreationContext context, Boolean trackedExternally)
   at Castle.MicroKernel.Lifestyle.ScopedLifestyleManager.<>n__0(CreationContext context, Boolean trackedExternally)
   at Castle.MicroKernel.Lifestyle.ScopedLifestyleManager.<>c__DisplayClass4_0.<Resolve>b__0(Action`1 afterCreated)
   at Castle.Windsor.Extensions.DependencyInjection.Scope.ExtensionContainerScope.GetCachedInstance(ComponentModel model, ScopedInstanceActivationCallback createInstance)
   at Castle.MicroKernel.Lifestyle.ScopedLifestyleManager.Resolve(CreationContext context, IReleasePolicy releasePolicy)
   at Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired, Burden& burden)
   at Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext context, Boolean instanceRequired)
   at Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context)
   at Castle.MicroKernel.DefaultKernel.ResolveComponent(IHandler handler, Type service, Arguments additionalArguments, IReleasePolicy policy, Boolean ignoreParentContext)
   at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(Type service, Arguments arguments, IReleasePolicy policy, Boolean ignoreParentContext)
   at Castle.MicroKernel.DefaultKernel.Resolve(Type service, Arguments arguments)
   at Castle.Windsor.WindsorContainer.Resolve(Type service)
   at Castle.Windsor.Extensions.DependencyInjection.WindsorScopedServiceProvider.ResolveInstanceOrNull(Type serviceType, Boolean isOptional)
   at Castle.Windsor.Extensions.DependencyInjection.WindsorScopedServiceProvider.GetRequiredService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.SaveTempDataAttribute.CreateInstance(IServiceProvider serviceProvider)
   at Microsoft.AspNetCore.Mvc.Filters.DefaultFilterProvider.ProvideFilter(FilterProviderContext context, FilterItem filterItem)
   at Microsoft.AspNetCore.Mvc.Filters.DefaultFilterProvider.OnProvidersExecuting(FilterProviderContext context)
   at Microsoft.AspNetCore.Mvc.Filters.FilterFactory.CreateUncachedFiltersCore(IFilterProvider[] filterProviders, ActionContext actionContext, List`1 filterItems)
   at Microsoft.AspNetCore.Mvc.Filters.FilterFactory.GetAllFilters(IFilterProvider[] filterProviders, ActionContext actionContext)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvokerCache.GetCachedResult(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvokerProvider.OnProvidersExecuting(ActionInvokerProviderContext context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionInvokerFactory.CreateInvoker(ActionContext actionContext)
   at Microsoft.AspNetCore.Mvc.Routing.ActionEndpointFactory.<>c__DisplayClass7_0.<CreateRequestDelegate>b__0(HttpContext context)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
2020-11-18 12:56:56 [Information] Request finished in 16.228ms 500 text/plain

If you stick with the built-in service provider and do not use windsor, it works fine even if the tests will be executed in parallel.
image

Would you be so kind and take a look at it?

@generik0
Copy link
Contributor

Hi @nativenolde
Good stuff, thank you!

I will look into it. Of the top of my head I expect it has to do with the scope handling being a static.

Your tests are great, give me a short time I will get back o you...

@nativenolde
Copy link
Contributor Author

Sure, take your time ... i guess it's getting complicated ;)

@generik0
Copy link
Contributor

@nativenolde is it just me, or is nothing attached? You can also expose a repo if you prefer.

@nativenolde
Copy link
Contributor Author

image

@generik0
Copy link
Contributor

OMG. noob here. Only saw 1 hyperlink. thanks.

@generik0
Copy link
Contributor

generik0 commented Nov 18, 2020

Hi @nativenolde I changed the test framework to Nunit. From stack overflow:

NUnit creates a new instance of the test class and then runs all of the tests method from the same instance. And each test fixture i believe is its own context.
I have also run them parallel with R#.

NUnit fixtures runs more like the host would. and with same memory.

image

image

InteractionTesting_NUinit.zip

Please review my conclusion. I will try to see if i can get the scope not to be static. But a since factory with a single host should not have any issues

You see this also passes:

image

@generik0
Copy link
Contributor

generik0 commented Nov 18, 2020

You see, here is the issue we need to improve to make this no longer an issue for test:

References a static:, and i cannot get the container or resolve the scope in any other way.. Until we get rid of the static scope pointers, there can only be 1 pr assembly.
image

All Castle.Windsor scops use a static memory for allocation..

@nativenolde
Copy link
Contributor Author

Yes, you are right, a single instance with a huge amount of parallel requests seems to work.

As windsor addresses enterprise and advanced needs, this could become a problem, because those users probably have a DevOps (ci/cd) workflow that could include such parallel tests.

Do you see a possibility to get the this redesigned or workaround?
Maybe in collaboration with @jonorossi ?

@generik0
Copy link
Contributor

@nativenolde i looked into it last night. I would need to rewrite the scope handling in Windsor not to utilize a static initialization.

I am not saying it is undoable, I just need to think more ;-)

@nativenolde
Copy link
Contributor Author

many thanks in advance for your effort!

@generik0
Copy link
Contributor

@nativenolde @AntonioDrusin @robertcoltheart @twenzel @ltines

I think i might be able to extend the IScopeAccessor to allow for some kernel resolving. The resolving getting a scope cache instance..
Please see PR spike #567

  • Please forgive name ScopedLifestyleManager, added
if (accessor.HasKernelScoping)
			{
				**var container = Kernel.Resolve<IScopeContainer>();
				scope = localScope.GetScope(context, Kernel);**
			}
			else
			{
				scope = localScope.GetScope(context);
			}

then the ExtensionContainerScope can be an instance instead of a static.

public ILifetimeScope GetScope(CreationContext context, IKernel kernel)
		{
			**var current = kernel.Resolve<IExtensionContainerScope>();**

			if(ExtensionContainerScope.Current == null)
			{
				throw new InvalidOperationException("No scope available");
			}
			return current.Current1;
		}

Do I have any community support to follow through on this train of thought?
THis will maybe make the scope be instancable and hence the scopes be a single instance for the container, and not be static, which is causing the issue above.
Plus just better OO not to have static "stuff" ;-)

NB the committed code needs more changes to work, and I do have tests passing on my end. But you would need to do more to test yourself. The PR was onlky ment at as a item for discussion.,..

/cc @jonorossi

@jonorossi
Copy link
Member

@generik0 I've left a few comments on #567, the direction you have taken isn't how this should work. Scope accessors usually use some external context to know what "scope" you are in, it doesn't make sense creating a scope object to stick it into the container just to resolve it back out inside a scope accessor. I'm unsure if resolving inside a scope accessor is even a good idea, there may be reentrancy issues. Scopes by definition are tied to a single container, it is the external context that needs to be sorted (e.g. like our ASP.NET scope used to use the static HttpContext).

@generik0
Copy link
Contributor

Hi @jonorossi
Thabks for your feedback!
I will kill the spike.

Personally l, one of the things I dislike about aspnet(core) the most is the static HttpContext.
I find it to be an anti OO...

Just like the static implementation of scope in castle.

Something should own the Scopes, and be able to access them.

I have looked at many other DIs, her the container is the owner of the scope, it does not appear to be static.

If we do not get ride of the static scopes, we will not be able to run more than 1 provider in the same assembly as this issue highlights.

But we can also decide to leave it be, and say it is by design.
1 entry assembly, 1 scope.

@nativenolde
Copy link
Contributor Author

nativenolde commented Nov 24, 2020

xUnit Workaround: Turn off parallelism inside the assembly
[assembly: CollectionBehavior(DisableTestParallelization = true)]

https://xunit.github.io/docs/running-tests-in-parallel.html

@ltines
Copy link
Contributor

ltines commented Nov 24, 2020

The problem comes from the fact the code expectes there will be only one host per app domain / running process.
Solution might be to tie the scopes to instance of IHost - so we could have scopes for multiple hosts within a process.

I think that would solve your issue. But I am thinking how relevant is it to real world use cases?

@rvdginste
Copy link
Contributor

@ltines I think it's a relevant issue in the context of unit tests: in the projects I work on, we also typically run the unit tests in parallel and have a separate castle windsor container setup for each test. It would be limiting if that would not be possible.

Is this related to the static RootScope in ExtensionContainerRootScope?

@generik0
Copy link
Contributor

generik0 commented Nov 25, 2020

@rvdginste it is related to ExtensionContainerRootScope and ExtensionContainerScope but primarily the GetScope method in the scope accessor, using the static scopes.

@ltines how would you bind to IHost If it is static?

It isnt just s matter of the uTests i feel. It is also an issue since the MS DI and other DIs do not fail on this. Hence, our implementation is not 100% conforming.

And my point is also that static scope handling is not stateless static.

@generik0
Copy link
Contributor

generik0 commented Nov 25, 2020

@jonorossi @rvdginste @ltines @nativenolde @AntonioDrusin please have a look at PR #573
I have managed to get the static handling out. Needed to use a thread static for the GetScope and the Stateful Static behaviour is replaces with a singleton.
The IoC has the root scope registered (might add custom interface instead of using ILifetimeScope?)

Have a look, please have a look if/when you have time-> Is this the correct path?

Please note, yes it needs to be cleand up... Please look at the feeling behind not the change. Not my mess.
Please note: I have added an extra set of tests that FAIL with the "old" implementation, but pass now...

@generik0
Copy link
Contributor

generik0 commented Nov 29, 2020

@jonorossi @rvdginste @ltines @nativenolde @AntonioDrusin please have a look at PR #573

Anyone have feelings about my cleanup of the assembly? Managed to get rid of most of the static "stuff in favour of a singleton. However, the root must be a asynlocal to allow for multiple for the Parallelization of this issue..

I only have next week (week 49) to finish this up before the next job.. If anyone has thoughts / time, It should be great!

My feeling is, This cleans up the lib and makes it more tracable / readable ..

Statics removed in favor of singleton instance of ExtensionContainerScope.
Instance of the ExtensionContainerScope is made shared between thread via AsyncLocal instance, Hence allowing root scope to be related to the initial assembely + thread it was created in
Cleaned up, removing unneeded logic to begin a scope, as it is always related to the root or current scope

@jonorossi
Copy link
Member

Pull request #573.

@rvdginste
Copy link
Contributor

@generik0 @ltines @jonorossi @nativenolde

@generik0 I checked your code, but I had the impression that @jonorossi recommended to not register the root scope in the container. Either way, your code gave me an idea and I made a pull request myself: #577 .

The changes are pretty small and are based on the following:

  • each container instance needs exactly one root scope instance
  • a new scope is always linked to the root scope: either directly, or indirectly (through linked parent scopes)
  • WindsorScopeFactory is used to create scopes and gets the root scope instance injected
  • ExtensionContainerScope gets a direct reference to the root scope

The existing unit tests run fine and the test project from @nativenolde runs fine with these changes. Still I'm not confident that the code does not break anything: I'm not familiar with the inner workings of Castle Windsor. Please take a look.

@generik0
Copy link
Contributor

generik0 commented Dec 1, 2020

@rvdginste Yes, your change is more simple/clean. I have closed my PR.

generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 2, 2020
rvdginste pushed a commit to rvdginste/Windsor that referenced this issue Dec 2, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 7, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 8, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 9, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 9, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 9, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 9, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 9, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 9, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 9, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 9, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 10, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 10, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 10, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 10, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 10, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 10, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 10, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 15, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 15, 2020
generik0 added a commit to rvdginste/Windsor that referenced this issue Dec 15, 2020
@jonorossi jonorossi added this to the vNext milestone Dec 16, 2020
@nativenolde
Copy link
Contributor Author

Thank you guys for fixing that!

@stylefish
Copy link

@jonorossi would it be possible to release a new nuget version for this? if i'm correct the latest release is 5.1.1 released on dec 8, but this fix was merged on dec 16.
thanks :)

rvdginste added a commit to rvdginste/Windsor that referenced this issue Aug 6, 2023
To fix issue castleproject#563 (support concurrently existing containers) a fix was
created in castleproject#577.  After the initial fix some refactorings were done on
the scope implementation that were not correct.

This commit changes the scope implementation back to the original
implementation of @ltines, but with the support for concurrent
containers.
rvdginste added a commit to rvdginste/Windsor that referenced this issue Aug 6, 2023
To fix issue castleproject#563 (support concurrently existing containers) a fix was
created in castleproject#577.  After the initial fix some refactorings were done on
the scope implementation that were not correct.

This commit changes the scope implementation back to the original
implementation of @ltines, but with the support for concurrent
containers.
gavinschultz pushed a commit to spectraqest/Windsor that referenced this issue Sep 12, 2023
To fix issue castleproject#563 (support concurrently existing containers) a fix was
created in castleproject#577.  After the initial fix some refactorings were done on
the scope implementation that were not correct.

This commit changes the scope implementation back to the original
implementation of @ltines, but with the support for concurrent
containers.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
6 participants