How to inject DbContext in a custom localization provider in ASP.NET Core? -
as explained in asp.net core docs can configure custom provider request localization. stated in docs:
suppose want let customers store language , culture in databases. write provider these values user.
for following code snippet provided in docs , in github sample localization.starterweb:
services.configure<requestlocalizationoptions>(options => { var supportedcultures = new[] { new cultureinfo("en-us"), new cultureinfo("fr") }; options.defaultrequestculture = new requestculture(culture: "en-us", uiculture: "en-us"); options.supportedcultures = supportedcultures; options.supporteduicultures = supportedcultures; options.requestcultureproviders.insert(0, new customrequestcultureprovider(async context => { // custom request culture logic // dbcontext needed here <-- return new providercultureresult("en"); }));});
can explain me how inject dbcontext
load user specific language db in above function?
well, can't inject via constructor because need instantiate during configureservices
method , container isn't available @ point.
instead can resolve via httpcontext
.
public class customrequestcultureprovider : requestcultureprovider { // note don't inject dependencies it, can safely // instantiate in configureservices method public customrequestcultureprovider() { } public override task<providercultureresult> determineprovidercultureresult(httpcontext httpcontext) { var dbcontext = httpcontext.requestservices .getservice<appdbcontext>(); } }
be aware though may less optimal, you'll have calls database on every request, maybe it's worth abstract further , use caching strategy depending on want dbcontext
.
usually 1 should avoid database calls in culture providers, filters etc. performance reasons
update:
there generic version of getservice<t>
, need import namespace via using microsoft.extensions.dependencyinjection;
.
Comments
Post a Comment