Skip to content

Opt out of UseSystemResourceKeys for ComponentModel.DataAnnotations#42274

Merged
eerhardt merged 1 commit intodotnet:masterfrom
eerhardt:Fix42257
Sep 22, 2020
Merged

Opt out of UseSystemResourceKeys for ComponentModel.DataAnnotations#42274
eerhardt merged 1 commit intodotnet:masterfrom
eerhardt:Fix42257

Conversation

@eerhardt
Copy link
Member

Since many resource strings in ComponentModel.DataAnnotations contain messages that will be shown to end-users, we shouldn't be trimming these resources.

Fix #42257

/cc @pranavkm

@ghost
Copy link

ghost commented Sep 15, 2020

Tagging subscribers to this area: @ajcvickers
See info in area-owners.md if you want to be subscribed.

Copy link
Contributor

@pranavkm pranavkm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As long as it works 👍

Copy link
Member

@jeffhandley jeffhandley left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know the options for the approaches, but I like the concept.

@ajcvickers
Copy link
Contributor

Don't block on me for this; happy to go with what those in the know deem best.

Since many resource strings in ComponentModel.DataAnnotations contain messages that will be shown to end-users, we generate the "default value" string into the SR code. When a trimmed app strips the system resources, these strings will be used instead of the resource keys.

Fix dotnet#42257
@eerhardt
Copy link
Member Author

eerhardt commented Sep 21, 2020

Talking it over with @ericstj and @tarekgh, we thought of the following options to fix this issue:

  1. Opt ComponentModel.Annotations out of UseSystemResourceKeys behavior.
    • This has the drawback @joperezr points out above - it will bring in ResourceManager when someone is using ComponentModel.Annotations.
  2. Hard-code the "default value" resource string in the ~30 places where strings are shown to end users.
    • This has the drawbacks of duplication in both code and increased binary size.
  3. Have the SR class generator generate the "default value" resource strings
    • This also has the drawback of increased binary size, but it is more maintainable than (2) above.
    1. A potential sub-option here is to only generate the "default value" strings for the browser build. But since this library ships in an OOB package, that is going to make packaging more complicated.
  4. Teach the ILLinker to do the string substitution (from the .resources file into the IL)

I've decided to take option (3) above and have updated this PR for it. The increase in size of the System.ComponentModel.Annotations assembly in the Windows x64 shared framework goes from 152 KB to 163 KB on my machine, which isn't significant. If we really think we need to save those 11 KB, we can look at enabling this only for the browser build (and eventually the ios and android builds).

@eerhardt
Copy link
Member Author

@ajcvickers @marek-safar - any thoughts/opinions here? I am going to propose we backport this change into 5.0.

@ajcvickers
Copy link
Contributor

@ajcvickers I really don't have enough context on how this all works to have any useful thoughts.

@marek-safar
Copy link
Contributor

@eerhardt I don't know what exactly GenerateResxSourceIncludeDefaultValues does but it sounds like a sensible compromise. I don't think we should target only browser for this setting as there are other size sensitive configurations in master.

@eerhardt
Copy link
Member Author

eerhardt commented Sep 22, 2020

I don't know what exactly GenerateResxSourceIncludeDefaultValues does

It causes our SR class code generation to go from:

    internal static partial class SR
    {
        internal static string @EmailAddressAttribute_Invalid => GetResourceString(
            "EmailAddressAttribute_Invalid");

to now be:

    internal static partial class SR
    {
        internal static string @EmailAddressAttribute_Invalid => GetResourceString(
            "EmailAddressAttribute_Invalid",
            @"The {0} field is not a valid e-mail address.");

Which means the resource string is now hard-coded in the C# file. This string gets passed in as the "defaultString" in this method:

internal static string GetResourceString(string resourceKey, string? defaultString = null)
{
if (UsingResourceKeys())
{
return defaultString ?? resourceKey;
}

Which means that when UsingResourceKeys() is true, that hard-coded string will be returned instead of the resourceKey string.

I don't think we should target only browser for this setting as there are other size sensitive configurations in master.

👍 , agreed. Thanks for the input.

@eerhardt eerhardt merged commit a0e1831 into dotnet:master Sep 22, 2020
@eerhardt eerhardt deleted the Fix42257 branch September 22, 2020 22:12
@eerhardt
Copy link
Member Author

/backport to release/5.0-rc2

@github-actions
Copy link
Contributor

@ghost ghost locked as resolved and limited conversation to collaborators Dec 7, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DataAnnotations Validation messages are incorrect in a trimmed app.

8 participants