Scrutor
Scrutor copied to clipboard
Update to .NET 8 and leverage keyed services for decoration
What do you think @DanHarltey?
Closes #171 Closes #208 Closes #65 Closes #200
Codecov Report
Attention: 36 lines in your changes are missing coverage. Please review.
Comparison is base (
a634e58) 64.71% compared to head (7fcedf7) 66.15%.
Additional details and impacted files
@@ Coverage Diff @@
## master #209 +/- ##
==========================================
+ Coverage 64.71% 66.15% +1.44%
==========================================
Files 25 24 -1
Lines 1278 1232 -46
Branches 0 112 +112
==========================================
- Hits 827 815 -12
+ Misses 451 387 -64
- Partials 0 30 +30
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
Thanks for the review, @DanHarltey! All good feedback 👍🏻
Hi @khellang When this will be available at the nuget package? We really need this. 😃
Please, please, please :)
PS We are doing future project but as for now we are using NET8 RC2. Before our release we are switching to full NET8 ofcoz. 😄
I can probably target RC2 and publish a prerelease version if anyone's eager to test it out.
I can probably target RC2 and publish a prerelease version if anyone's eager to test it out.
@khellang Yes please 🙏🏻
Hi @khellang 😃 I'm just cloned branch for net8 and adopted source code into my project. 😄
Now I can wait for released version of net8 and newest scrutor 😃 I hope that Scan will have appropriate extensions for keyed services also. 👍🏻 Thanks for help. ❤️
I hope that Scan will have appropriate extensions for keyed services also. 👍🏻
What does that mean? How do you envision using keyed services with Scrutor?
I hope that Scan will have appropriate extensions for keyed services also. 👍🏻
What does that mean? How do you envision using keyed services with Scrutor?
I would love to register services from given assembly as keyed with specified key,
For example. I have modular monolith. Each module is a separated project/assembly. I execute services.Scan(...) to register all ICommandHandler from that assembly. I want to register them as keyed services. Thanks to that I can resolve only those services in particular module.
For now I am using this hacky solution 😄
var tempServices = new ServiceCollection();
tempServices.Scan( );
foreach (var service in tempServices)
{
// register service as keyed
}
It would be great to do this something like:
new ServiceCollection()
.Scan(s => s.FromAssembliesOf(module.GetType())
.AddClasses(c =>
{
c.AssignableToAny(
typeof(ICommandHandler<,>),
typeof(ICommandHandler<>),
typeof(IQueryHandler<,>),
typeof(IEventHandler<>),
typeof(IDomainEventHandler<>))
.WithoutAttribute<DecoratorAttribute>();
}, false)
.AsKeyed(moduleName) // <========
.AsImplementedInterfaces()
.WithScopedLifetime());
If it's allowed to register multiple services against the same key, it could work. I'll have to verify it.
Hi @khellang :) How about this? Will be any chance for this? 😃
Hi @khellang ?
How about now, after NET8 premiere? 😄
Still waiting :)
@rekosko What exactly are you waiting for? The latest version on NuGet works fine on .NET 8, right?
@khellang yes I confirm it works on .NET 8 :) But decoration for keyed services is not yet implemented or I missed the purpose of this PR?
That's not the purpose of this PR, no. Although I want to add that as well before shipping a new version. This PR replaces an old hack to avoid StackOverflowExceptions when decorating services with keyed services under the covers. It also files a few other long-standing issues and pending breaking changes.
BTW, if anyone wants to contribute support for decorating keyed services to get a release out sooner, that would be cool.
@khellang Can this be merged into master or it's not complete or it needs more testing? Or it's better to base all the tests and work on feature/net8.0 branch?
It's not totally complete and needs more tests. It's better to base work off this branch for now. Once this goes into master, I will release a new major version.