Closed jimmyca15 closed 2 months ago
To open back up the discussion to see if we can come up with a good approach we can build off what was proposed previously which was the following
services.AddSingleton<IFunctionality, SecretSaucev1>() // v1 - this is the default version
.OverrideForFeature<IFunctionality, SecretSaucev2>("NewEnhancedVersion") // v2 - this is the new version
I like this proposal by @philcarbone.
Consumption for this can be done through a service that is added into by the feature management package.
public interface IFeatureService<T>
{
Task<T> GetValue<T>();
}
IFeatureService would evaluate the state of the "NewEnhancedVersion" and return which of the features should be returned based on the initial registration of features. This is **late binding**. It does not use the state of the feature during the call to
Services.OverrideForFeatureit uses the state during
IFeatureService
Here would be an example usage.
public class MyType
{
private readonly IFeatureService<IFunctionality> _secretSauce
public MyType(IFeatureService<IFunctionality> secretSauce)
{
_secretSauce = secretSauce.GetValue();
}
public async Task DoSomething()
{
IFunctionality secretSauce = await _secretSauce.GetValue();
// Use it.
}
}
Any news about this? Just came across this problem now and our solution atm is to inject all versions and the have a provider for each type. It would be nice if this library provided something for this out of the box.
@SpaceOgre I noticed that in .NET 8, registering service with a key is possible. Maybe it would be helpful for your case. https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-preview-7/#keyed-services-support-in-microsoft-extensions-dependencyinjection
@SpaceOgre #335 We are implementing the new feature called variant-based injection. Hopefully, this can go with the next preview release.
This is a migration of the issue https://github.com/Azure/AppConfiguration/issues/68 for better tracking and coming to a solution.