microsoft / FeatureManagement-Dotnet

Microsoft.FeatureManagement provides standardized APIs for enabling feature flags within applications. Utilize this library to secure a consistent experience when developing applications that use patterns such as beta access, rollout, dark deployments, and more.
MIT License
1.03k stars 114 forks source link

Feature-Based Injection #39

Closed jimmyca15 closed 2 months ago

jimmyca15 commented 4 years ago

This is a migration of the issue https://github.com/Azure/AppConfiguration/issues/68 for better tracking and coming to a solution.

jimmyca15 commented 4 years 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 toServices.OverrideForFeatureit uses the state duringIFeatureService.GetValue()`. This allows dynamic change of implementation during lifetime of the application and even different implementation on different requests.

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.
  }
}
SpaceOgre commented 3 years ago

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.

zhiyuanliang-ms commented 10 months ago

@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

zhiyuanliang-ms commented 8 months ago

@SpaceOgre #335 We are implementing the new feature called variant-based injection. Hopefully, this can go with the next preview release.