AspNetCoreLocalization icon indicating copy to clipboard operation
AspNetCoreLocalization copied to clipboard

Data Annotations - Caching

Open MathieuDR opened this issue 7 years ago • 3 comments

I'm using ASP.NET Core 2 together with this adaptation of AspNetCoreLocalization. I'm however a bit 'stuck' on resetting the cache for my data annotation translations.

When I reset the cache, everything is updated (global translations (custom) and my resource translations) however, my data annotations refuse to be 'updated', even though they should be used as resource translations (stock behaviour).

const bool useTypeFullNames = false;
const bool useOnlyPropertyNames = false;
const bool returnOnlyKeyIfNotFound = false;
bool createNewRecord = env.IsDevelopment();
            

services.AddDapperLocalization(options => options.UseSettings(
       useTypeFullNames, useOnlyPropertyNames, returnOnlyKeyIfNotFound, createNewRecord
));

services.AddMvc()
       .AddViewLocalization()
       .AddDataAnnotationsLocalization()
       .AddRazorOptions(options => { options.PageViewLocationFormats.Add("/Pages/Partials/{0}.cshtml"); });

Is there any way I can also make the data annotation translations reset cache?

MathieuDR avatar May 29 '18 15:05 MathieuDR

+1 Exactly this happens to me also.

velorium-star avatar Jan 23 '19 12:01 velorium-star

I had same problem... seems to be a problem with DataAnnotation resource that in some way continue to reference the first ISqlLocalizer object created, also after cleaning the internal cache dictionary.

I solved in this way:

SqlStringLocalizerFactory.cs :


public void ResetCache()
        {
            lock (_context)
            {
                _context.DetachAllEntities();
            }

            foreach (String localizerKey in _resourceLocalizations.Keys)
            {
                SqlStringLocalizer localizer = _resourceLocalizations[localizerKey] as SqlStringLocalizer;

                localizer.ReloadLocalizations(GetAllFromDatabaseForResource(localizerKey));
            }
        }

        public void ResetCache(Type resourceSource)
        {
            lock (_context)
            {
                _context.DetachAllEntities();
            }

            IStringLocalizer returnValue;
            
            if (_resourceLocalizations.TryGetValue(resourceSource.FullName, out returnValue))
            {
                SqlStringLocalizer localizer = _resourceLocalizations[resourceSource.FullName] as SqlStringLocalizer;

                localizer.ReloadLocalizations(GetAllFromDatabaseForResource(resourceSource.FullName));
            }

            
        }

SqlStringLocalizer.cs:

private Dictionary<string, string> _localizations; //Removed readonly

public void ReloadLocalizations(Dictionary<string, string> localizations)
        {
            if (_localizations != null)
                _localizations.Clear();

            _localizations = localizations;
        }

sihon82 avatar Jan 30 '20 13:01 sihon82

Could this bug fix be implemented please?

JoeGoodwin avatar May 21 '21 09:05 JoeGoodwin