DI a klasa statyczna

0

Do projektu w ASP.NET Core próbuję dodać lokalizację zgodnie z https://docs.asp.net/en/latest/fundamentals/localization.html. Wykorzystuję w tym celu wstrzyknięty IStringLocalizer do podmiany stringów w poszczególnych językach. Mam jednak pewną klasę statyczną do weryfikacji argumentów z pliku konfiguracyjnego (jak poniżej), w której chciałbym spolonizować rzucane wyjątki. Jak w takiej sytuacji użyć IStringLocalizer do zmiany "Incorrect OLT name"? Z góry dzięki za wskazówki.

public static class OltFormatChecks
{
        public static string CheckOltNameFormat(string name)
        {
            if (!string.IsNullOrWhiteSpace(name))
                return name;
            else
                throw new ArgumentException("Incorrect OLT name");
        }
}
 
0

W kontrolerze: this.HttpContext.RequestServices, ale zastanowiłbym się czy nie zrobić tego jako zwykłej klasy z jakąś abstrakcją w postaci interfejsu i nie zarejestrował w DI jako singleton.

0

Nie do końca rozumiem. Teraz wstrzykuję IStringLocalizer do klas i tam z niego korzystam. Ty z kolei sugerujesz zarejestrowanie tej klasy docelowej. Jak miałoby to wyglądać?

0

IMO powinieneś zrobić jakiś interface w stylu:

public interface IFormatValidator
{
	string ValidateName(string name);
	string ValidateZipCode(string zipCode);
	string ValidateSomething(string something);
}

I następnie implementację na zasadzie:

public class FormatValidator : IFormatValidator
{
	private readonly IStringLocalizer<FormatValidator> stringLocalizer;

	public FormatValidator(IStringLocalizer<FormatValidator> stringLocalizer)
	{
		this.stringLocalizer = stringLocalizer;
	}

	public string ValidateName(string name)
	{
	 	if (!string.IsNullOrWhiteSpace(name))
               		return name;
            	else
                	throw new ArgumentException(stringLocalizer["IncorrectOLTName"]);
	}

	/* Reszta implementacji */
}

Musisz teraz dodać tą usługę w klasie Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IFormatValidator, FormatValidator>();
}

I teraz wszędzie tam gdzie potrzebujesz walidacji, dajesz po prostu w konstruktorze kontrolera argument IFormatValidator.

3
Mateusz napisał(a):

IMO powinieneś zrobić jakiś interface w stylu:

public interface IFormatValidator
{
	string ValidateName(string name);
	string ValidateZipCode(string zipCode);
	string ValidateSomething(string something);
}

Ale po co mu w ogóle ten łamiący ISP interfejs? Nie proście wstrzyknąć klasę jako singleton?

0

Ok, zrobiłem tak jak polecał somekind. Mam jeszcze takie dwa pytania jako początkujący. Załóżmy, że mam swego rodzaju słowniki jak poniżej (podaję kod z SNMP i ma mi to zwrócić ResponseDescription czyli opis oraz typ wyliczeniowy sugerujący czy wszystko jest ok).

  1. Czy można w jakiś sposób skrócić te metody poniżej, żeby nie klepać każdej osobno dla każdego ze słowników?
  2. Załóżmy, że chciałbym sobie tą klasę zlokalizować (zrobić jedynie opisy angielskie, a polskie w resources) i wstrzyknąć tu IStringLocalizer. Czy taka konstrukcja łańcuchowa, gdzie IStringLocalizer używam w IResponseDescriptionDictionaries, a to z kolei wstrzykuję sobie w inne miejsce jest poprawne z punktu widzenia programowanie i używani DI?
    public class ResponseDescriptionDictionaries : IResponseDescriptionDictionaries
    {
        private const int _uknownResponseCode = 255;

        // ONT Block Status
        // 1 - autoblock
        // 2 - manual block
        // 255 - unblock

        readonly Dictionary<int?, ResponseDescription> BlockStatusResponseDictionary = new Dictionary<int?, ResponseDescription>()
        {
            { 1, new ResponseDescription("autoblock", "blokada automatyczna", SeverityLevel.Danger) },
            { 2, new ResponseDescription("manual block", "blokada ręczna", SeverityLevel.Danger) },
            { 255, new ResponseDescription("unblock", "brak blokady", SeverityLevel.Success) }
        };

        // ONT Block Reason
        // 1 - manual block
        // 2 - sourcemac block
        // 255 - unblock

        readonly Dictionary<int?, ResponseDescription> BlockReasonResponseDictionary = new Dictionary<int?, ResponseDescription>()
        {
            { 1, new ResponseDescription("manual block", "blokada ręczna", SeverityLevel.Danger) },
            { 2, new ResponseDescription("sourcemac block", "blokada sourcemac", SeverityLevel.Danger) },
            { 255, new ResponseDescription("unblock", "brak blokady", SeverityLevel.Success) }
        };


        ResponseDescription IResponseDescriptionDictionaries.BlockStatusResponse(int responseCode)
        {
            ResponseDescription _responseDescription;

            if (BlockStatusResponseDictionary.ContainsKey(responseCode))
            {
                BlockStatusResponseDictionary.TryGetValue(responseCode, out _responseDescription);
            }
            else
            {
                BlockStatusResponseDictionary.TryGetValue(_uknownResponseCode, out _responseDescription);
            }

            return _responseDescription;
        }

        ResponseDescription IResponseDescriptionDictionaries.BlockReasonResponse(int responseCode)
        {
            ResponseDescription _responseDescription;

            if (BlockReasonResponseDictionary.ContainsKey(responseCode))
            {
                BlockReasonResponseDictionary.TryGetValue(responseCode, out _responseDescription);
            }
            else
            {
                BlockReasonResponseDictionary.TryGetValue(_uknownResponseCode, out _responseDescription);
            }

            return _responseDescription;
        }
}
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1