Skip to content

Commit e419240

Browse files
committed
Use Lazy<TContainerEntity> for thread safety
1 parent d2669c0 commit e419240

File tree

1 file changed

+15
-20
lines changed

1 file changed

+15
-20
lines changed

src/Testcontainers.Xunit/ContainerFixture.cs

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,34 @@ namespace Testcontainers.Xunit;
55
/// See <a href="https://xunit.net/docs/shared-context">Shared Context between Tests</a> from xUnit.net documentation for more information about fixtures.
66
/// A logger is automatically configured to write diagnostic messages to xUnit's <see cref="IMessageSink"/>.
77
/// </summary>
8-
/// <param name="messageSink">The message sink used for reporting diagnostic messages.</param>
98
/// <typeparam name="TBuilderEntity">The builder entity.</typeparam>
109
/// <typeparam name="TContainerEntity">The container entity.</typeparam>
1110
[PublicAPI]
12-
public class ContainerFixture<TBuilderEntity, TContainerEntity>(IMessageSink messageSink) : IAsyncLifetime
11+
public class ContainerFixture<TBuilderEntity, TContainerEntity> : IAsyncLifetime
1312
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity>, new()
1413
where TContainerEntity : IContainer
1514
{
16-
private TContainerEntity _container;
15+
private Lazy<TContainerEntity> _container;
16+
17+
public ContainerFixture(IMessageSink messageSink)
18+
{
19+
MessageSink = messageSink;
20+
_container = new Lazy<TContainerEntity>(() =>
21+
{
22+
var containerBuilder = new TBuilderEntity().WithLogger(new MessageSinkLogger(MessageSink));
23+
return Configure(containerBuilder).Build();
24+
});
25+
}
1726

1827
/// <summary>
1928
/// The message sink used for reporting diagnostic messages.
2029
/// </summary>
21-
protected IMessageSink MessageSink { get; } = messageSink;
30+
protected IMessageSink MessageSink { get; }
2231

2332
/// <summary>
2433
/// The container instance.
2534
/// </summary>
26-
public TContainerEntity Container
27-
{
28-
get
29-
{
30-
if (_container == null)
31-
{
32-
var containerBuilder = new TBuilderEntity().WithLogger(new MessageSinkLogger(MessageSink));
33-
_container = Configure(containerBuilder).Build();
34-
}
35-
return _container;
36-
}
37-
}
35+
public TContainerEntity Container => _container.Value;
3836

3937
/// <summary>
4038
/// Extension point to further configure the container instance.
@@ -54,10 +52,7 @@ public TContainerEntity Container
5452
/// </example>
5553
/// <param name="builder">The container builder.</param>
5654
/// <returns>A configured instance of <typeparamref name="TBuilderEntity" />.</returns>
57-
protected virtual TBuilderEntity Configure(TBuilderEntity builder)
58-
{
59-
return builder;
60-
}
55+
protected virtual TBuilderEntity Configure(TBuilderEntity builder) => builder;
6156

6257
/// <inheritdoc />
6358
Task IAsyncLifetime.InitializeAsync() => InitializeAsync();

0 commit comments

Comments
 (0)