mirror of
https://github.com/oliverbooth/X10D
synced 2024-11-25 19:58:48 +00:00
Compare commits
3 Commits
70cb1b7230
...
71a9c787e2
Author | SHA1 | Date | |
---|---|---|---|
71a9c787e2 | |||
42cb9acb48 | |||
0afe45f4d6 |
@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [3.3.1] - 2023-08-21
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- X10D.Hosting: Fixed `AddHostedSingleton` not accepting an interface as the service type.
|
||||||
|
|
||||||
## [3.3.0] - 2023-08-21
|
## [3.3.0] - 2023-08-21
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
@ -583,7 +589,8 @@ please [open an issue](https://github.com/oliverbooth/X10D/issues)!
|
|||||||
|
|
||||||
Earlier versions of this package are undocumented and unlisted from package results.
|
Earlier versions of this package are undocumented and unlisted from package results.
|
||||||
|
|
||||||
[unreleased]: https://github.com/oliverbooth/X10D/compare/v3.3.0...main
|
[unreleased]: https://github.com/oliverbooth/X10D/compare/v3.3.1...main
|
||||||
|
[3.3.1]: https://github.com/oliverbooth/X10D/releases/tag/v3.3.1
|
||||||
[3.3.0]: https://github.com/oliverbooth/X10D/releases/tag/v3.3.0
|
[3.3.0]: https://github.com/oliverbooth/X10D/releases/tag/v3.3.0
|
||||||
[3.2.2]: https://github.com/oliverbooth/X10D/releases/tag/v3.2.2
|
[3.2.2]: https://github.com/oliverbooth/X10D/releases/tag/v3.2.2
|
||||||
[3.2.0]: https://github.com/oliverbooth/X10D/releases/tag/v3.2.0
|
[3.2.0]: https://github.com/oliverbooth/X10D/releases/tag/v3.2.0
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<PackageTags>dotnet extension-methods</PackageTags>
|
<PackageTags>dotnet extension-methods</PackageTags>
|
||||||
<PackageReleaseNotes>$([System.IO.File]::ReadAllText("$(MSBuildProjectDirectory)/../CHANGELOG.md"))</PackageReleaseNotes>
|
<PackageReleaseNotes>$([System.IO.File]::ReadAllText("$(MSBuildProjectDirectory)/../CHANGELOG.md"))</PackageReleaseNotes>
|
||||||
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
|
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
|
||||||
<VersionPrefix>3.3.0</VersionPrefix>
|
<VersionPrefix>3.3.1</VersionPrefix>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<PackageTags>dotnet extension-methods</PackageTags>
|
<PackageTags>dotnet extension-methods</PackageTags>
|
||||||
<PackageReleaseNotes>$([System.IO.File]::ReadAllText("$(MSBuildProjectDirectory)/../CHANGELOG.md"))</PackageReleaseNotes>
|
<PackageReleaseNotes>$([System.IO.File]::ReadAllText("$(MSBuildProjectDirectory)/../CHANGELOG.md"))</PackageReleaseNotes>
|
||||||
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
|
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
|
||||||
<VersionPrefix>3.3.0</VersionPrefix>
|
<VersionPrefix>3.3.1</VersionPrefix>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
|
@ -29,11 +29,12 @@ public static class ServiceCollectionExtensions
|
|||||||
/// <typeparam name="TImplementation">The type of the implementation to use.</typeparam>
|
/// <typeparam name="TImplementation">The type of the implementation to use.</typeparam>
|
||||||
/// <returns>A reference to this instance after the operation has completed.</returns>
|
/// <returns>A reference to this instance after the operation has completed.</returns>
|
||||||
public static IServiceCollection AddHostedSingleton<TService, TImplementation>(this IServiceCollection services)
|
public static IServiceCollection AddHostedSingleton<TService, TImplementation>(this IServiceCollection services)
|
||||||
where TService : class, IHostedService
|
where TService : class
|
||||||
where TImplementation : class, TService
|
where TImplementation : class, TService, IHostedService
|
||||||
{
|
{
|
||||||
services.AddSingleton<TService, TImplementation>();
|
services.AddSingleton<TService, TImplementation>();
|
||||||
return services.AddSingleton<IHostedService, TService>(provider => provider.GetRequiredService<TService>());
|
return services.AddSingleton<IHostedService, TImplementation>(provider =>
|
||||||
|
(TImplementation)provider.GetRequiredService<TService>());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -29,6 +29,27 @@ public class ServiceCollectionTests
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void AddHostedSingleton_ShouldRegisterServiceAsSingletonAndAsHostedService_GivenServiceAndImplTypes()
|
||||||
|
{
|
||||||
|
var services = new ServiceCollection();
|
||||||
|
|
||||||
|
services.AddHostedSingleton<ITestService, TestService>();
|
||||||
|
|
||||||
|
var serviceProvider = services.BuildServiceProvider();
|
||||||
|
var service = serviceProvider.GetService<ITestService>();
|
||||||
|
var hostedService = serviceProvider.GetService<IHostedService>();
|
||||||
|
|
||||||
|
Assert.Multiple(() =>
|
||||||
|
{
|
||||||
|
Assert.That(service, Is.Not.Null);
|
||||||
|
Assert.That(hostedService, Is.Not.Null);
|
||||||
|
Assert.IsAssignableFrom<TestService>(service);
|
||||||
|
Assert.IsAssignableFrom<TestService>(hostedService);
|
||||||
|
Assert.That(hostedService, Is.SameAs(service));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void AddHostedSingleton_ShouldRegisterServiceTypeAsSingletonAndAsHostedService()
|
public void AddHostedSingleton_ShouldRegisterServiceTypeAsSingletonAndAsHostedService()
|
||||||
{
|
{
|
||||||
@ -50,8 +71,38 @@ public class ServiceCollectionTests
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class TestService : IHostedService
|
[Test]
|
||||||
|
public void AddHostedSingleton_ShouldRegisterServiceTypeAsSingletonAndAsHostedService_GivenServiceAndImplTypes()
|
||||||
{
|
{
|
||||||
|
var services = new ServiceCollection();
|
||||||
|
|
||||||
|
services.AddHostedSingleton(typeof(ITestService), typeof(TestService));
|
||||||
|
|
||||||
|
var serviceProvider = services.BuildServiceProvider();
|
||||||
|
var service = serviceProvider.GetService<ITestService>();
|
||||||
|
var hostedService = serviceProvider.GetService<IHostedService>();
|
||||||
|
|
||||||
|
Assert.Multiple(() =>
|
||||||
|
{
|
||||||
|
Assert.That(service, Is.Not.Null);
|
||||||
|
Assert.That(hostedService, Is.Not.Null);
|
||||||
|
Assert.IsAssignableFrom<TestService>(service);
|
||||||
|
Assert.IsAssignableFrom<TestService>(hostedService);
|
||||||
|
Assert.That(hostedService, Is.SameAs(service));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private interface ITestService
|
||||||
|
{
|
||||||
|
void Foo();
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed class TestService : ITestService, IHostedService
|
||||||
|
{
|
||||||
|
public void Foo()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public Task StartAsync(CancellationToken cancellationToken)
|
public Task StartAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<PackageTags>dotnet extension-methods</PackageTags>
|
<PackageTags>dotnet extension-methods</PackageTags>
|
||||||
<PackageReleaseNotes>$([System.IO.File]::ReadAllText("$(MSBuildProjectDirectory)/../CHANGELOG.md"))</PackageReleaseNotes>
|
<PackageReleaseNotes>$([System.IO.File]::ReadAllText("$(MSBuildProjectDirectory)/../CHANGELOG.md"))</PackageReleaseNotes>
|
||||||
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
|
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
|
||||||
<VersionPrefix>3.3.0</VersionPrefix>
|
<VersionPrefix>3.3.1</VersionPrefix>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<PackageReadmeFile>README.md</PackageReadmeFile>
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
<PackageReleaseNotes>$([System.IO.File]::ReadAllText("$(MSBuildProjectDirectory)/../CHANGELOG.md"))</PackageReleaseNotes>
|
<PackageReleaseNotes>$([System.IO.File]::ReadAllText("$(MSBuildProjectDirectory)/../CHANGELOG.md"))</PackageReleaseNotes>
|
||||||
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
|
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
|
||||||
<VersionPrefix>3.3.0</VersionPrefix>
|
<VersionPrefix>3.3.1</VersionPrefix>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
|
Loading…
Reference in New Issue
Block a user