Comments (7)
This is somewhat related to #222
Assuming we had something like a services.RegisterOptionsSetup<T>
which would reflect on T and register all of the various IConfigureOptions that T implements. We could then just use that new api to register Startup automatically, the one difference from your gist would be that Startup would need to implement the interfaces. Or maybe we should just have a new dedicated SetupOptions class for this, and register it by convention if it exists:
public class SetupOptions : IConfigureOptions<MvcOptions>, IConfigureOptions<RazorViewEngineOptions>, IConfigureOptions<LocalizationOptions> {
public SetupOptions(IStringLocalizer<Model> localizer)
public void ConfigureOptions(LocalizationOptions options)
{
options.ResourcesPath = "Resources";
}
public void ConfigureOptions(MvcOptions options)
{
options.ModelBindingMessageProvider.ValueMustNotBeNullAccessor =
value => localizer["Value '{0}' appears to be null and that's not valid.", value];
}
public void ConfigureOptions(RazorViewEngineOptions options)
{
var embeddedProvider = new EmbeddedFileProvider(typeof(Model).GetTypeInfo().Assembly);
options.FileProviders.Add(embeddedProvider);
}
}
from options.
the one difference from your gist would be that
Startup
would need to implement the interfaces
As mentioned in the description, there be 🐉s here. Startup
is used far too early to get services from DI in its constructor.
dedicated
SetupOptions
class for this
That'll work though it seems odd to separate configuration from Startup
so soon after our templates merged Program
into Startup
.
from options.
BTW it's not clear any user IConfigurerOptions<TOptions>
implementations are necessary if we're going to discover these methods using Reflection anyhow. I was thinking more about an extension of the Startup.Configure(...)
convention but with all services available.
from options.
I like decoupling this feature from startup. It solves a bunch of problems.
from options.
I like decoupling this feature from startup.
That's fine -- I just said it was "odd" (timing) 😸 But, will we require a separate class when performing service-reliant configuration?
from options.
I don't think its too bad to have an optional dedicated ConfigureOptions class that configures a whole bunch of options.
public class ConfigureOptions : IConfigureOptions<SomeOptions>, IPostConfigureOptions<OtherOptions>, IConfigureNamedOptions<NamedOptions> {
public ConfigureOptions(IServiceA a, IServiceB b) { }
public Configure(SomeOptions o) { o.Value = a.DoSomething() }
public PostConfigure(OtherOptions o) { o.Value = b.DoSomething(); }
public Configure(NamedOptions o, string name) {
if (name == b.ShouldConfigure(name))
o.Value = b.DoSomething());
}
Its not required, as you can still do the old services.AddSingleton<IConfigureOptions<T>, YourConfigure>()
I'm not exactly sure where the best place to plumb all of this, maybe a new line in Program.cs?
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
// This would just translate to a services.RegisterOptionsSetup<ConfigureOptions>
.ConfigureOptions<ConfigureOptions>()
.Build();
from options.
ConfigureOptions<T>
has been merged already, new sugar around not having to implement IConfigureOptoins to use depedencies is being tracked by #236 which has a PR open as well.
from options.
Related Issues (20)
- [Annoucement][Draft] IOptionsSnapshot is now a scoped service HOT 2
- Overload Configure with access to IServiceProvider HOT 3
- Inconsistent use of null vs DefaultName HOT 1
- Extension methods for more concise registration of IConfigureOptions/IPostConfigureOptions HOT 1
- IConfigureOptions isn't called for authentication (named) options HOT 7
- [Question] Get Options immediately after Configure HOT 5
- Add built in support for validating options HOT 4
- Backwards Compatibility Broken with IOptionsSnapshot when upgrading to .Net Core 2.0 HOT 5
- See if we can make it easier to implement IConfigureNamedOptions HOT 2
- 1st class support for Request options HOT 4
- Add Configure<TOptions, TService1...5>(Action<TOptions>, TService1...5) overloads HOT 1
- OptionsBuilder to chain configuration calls HOT 7
- Allow collections to be replaced, when defined in IConfiguration HOT 1
- DI exception is not raised when IOptions<Poco> is not configured. HOT 2
- Call AddOptions() from Configure/AddOptions HOT 1
- IOptionsSnapshot not working in docker container using bind mount HOT 2
- Make IConfigureNamedOptions.Configure async HOT 1
- IOptionsSnapshot is not working with singleton services HOT 1
- THIS ISSUE TRACKER IS CLOSED - use the Home repo issue tracker HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from options.