Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature-Based Injection #39

Closed
jimmyca15 opened this issue Dec 19, 2019 · 4 comments
Closed

Feature-Based Injection #39

jimmyca15 opened this issue Dec 19, 2019 · 4 comments

Comments

@jimmyca15
Copy link
Member

This is a migration of the issue Azure/AppConfiguration#68 for better tracking and coming to a solution.

@jimmyca15
Copy link
Member Author

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 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
Copy link

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
Copy link
Contributor

@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
Copy link
Contributor

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants