Skip to content

Commit c6bc0f0

Browse files
AGiorgettirvdginste
authored andcommitted
Refs: castleproject#646 Castle.Windsor.Extension.DepencencyInjection removed null
check on scope cache (AsyncLocal can be null on Threads coming from Threadpool.UnsafeQueueUserWorkItem, having no null check was also the original behavior)
1 parent 464595b commit c6bc0f0

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using Castle.MicroKernel.Registration;
2+
using Castle.Windsor.Extensions.DependencyInjection.Tests.Components;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using System;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
using Xunit;
8+
9+
namespace Castle.Windsor.Extensions.DependencyInjection.Tests {
10+
public class ResolveFromThreadpoolUnsafe {
11+
[Fact]
12+
public async Task Can_Resolve_From_ServiceProvider() {
13+
14+
var serviceProvider = new ServiceCollection();
15+
var container = new WindsorContainer();
16+
var f = new WindsorServiceProviderFactory(container);
17+
f.CreateBuilder(serviceProvider);
18+
19+
container.Register(
20+
Component.For<IUserService>().ImplementedBy<UserService>()
21+
);
22+
23+
IServiceProvider sp = f.CreateServiceProvider(container);
24+
25+
var actualUserService = sp.GetService<IUserService>();
26+
Assert.NotNull(actualUserService);
27+
28+
/*
29+
ThreadPool.UnsafeQueueUserWorkItem(state => {
30+
// resolving using castle (without scopes) works
31+
var actualUserService = container.Resolve<IUserService>(nameof(UserService));
32+
Assert.NotNull(actualUserService);
33+
}, null);
34+
*/
35+
36+
TaskCompletionSource<IUserService> tcs = new TaskCompletionSource<IUserService>();
37+
38+
ThreadPool.UnsafeQueueUserWorkItem(state => {
39+
try {
40+
var actualUserService = sp.GetService<IUserService>();
41+
Assert.NotNull(actualUserService);
42+
}
43+
catch (Exception ex) {
44+
tcs.SetException(ex);
45+
return;
46+
}
47+
tcs.SetResult(actualUserService);
48+
}, null);
49+
50+
// Wait for the work item to complete.
51+
var task = tcs.Task;
52+
IUserService result = await task;
53+
Assert.NotNull(result);
54+
}
55+
}
56+
}

0 commit comments

Comments
 (0)