Как использовать общий метод для всех проектов без необходимости передавать пространства имен - PullRequest
0 голосов
/ 11 сентября 2018

Я работаю над локализацией текстов во всех 5 проектах, которые вместе составляют продукт.

Localization: Итак, если пользователь из США, он увидит товар в en-US, если он из Китая, то увидит текст в ch-CH.

И я застрял в нижних вещах.

Каждый проект будет иметь OWN корзину файла Resx (файл, в котором я храню переводы).

Project A - en-US.resx file
            cn-CH.resx file
Project B - en-US.resx file
            ch-CH.resx file
Project C - en-US.resx file
            ch-CH.resx file
.
.
.

Теперь у меня есть проект Common, на который ссылаются все проекты. Так что я написал singleton класс в Common

public sealed class Translation 
{
    private static readonly Translation translation = new Translation();

    public static Translation GetTranslation { get { return translation; } }
    private Translation() { }
    static Translation() { }

    public string GetTranslatedMessage(string key, CultureInfo culture, string message, string namespace)
    {
            var rm = new ResourceManager("namespace", Assembly.GetExecutingAssembly());
            message = rm.GetString(key, culture);
            return message;
    }
}

Пока все хорошо, как вы можете видеть, я использую namespace как 4th parameter с resource manager, так что я могу искать перевод в нужной корзине проекта, я просто делаю что-то вроде ниже :

Translation.Translate(key, culture, message, namespace) // singleton class taking in the namespace to find the right bucket

И работает нормально.

Вопрос / проблема : Но в каждом проекте мне нужно передавать пространство имен, я имею в виду, что когда бы я ни звонил, мне нужно передавать пространство имен. Мне интересно, есть ли какой-то способ, я могу неявно сказать, в какую корзину должен заглянуть каждый проект. Могу ли я использовать Abstract или 2 одноэлементных класса, может быть factory? Я новичок, поэтому я не знаю, как решить эту проблему. Я просто не хочу передавать пространство имен при каждом вызове.

WorkAround: Я могу повторить один и тот же одноэлементный код в каждом проекте и заставить его работать, но затем я буду повторять один и тот же одноэлементный код в каждом проекте /

1 Ответ

0 голосов
/ 11 сентября 2018

Если вы открыты для взломанного решения, и ваши различные файлы с пространством имен находятся в папках, названных в соответствии с пространством имен, вы можете использовать CallerFilePathAttribute и отделить пространство имен от пути. Это кажется хрупким:

Поиск C # Информация о вызывающем абоненте . Образец, который они показывают:

public void DoProcessing()  
{  
    TraceMessage("Something happened.");  
}  

public void TraceMessage(string message,  
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",  
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",  
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)  
{  
    System.Diagnostics.Trace.WriteLine("message: " + message);  
    System.Diagnostics.Trace.WriteLine("member name: " + memberName);  
    System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);  
    System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);  
}  

// Sample Output:  
//  message: Something happened.  
//  member name: DoProcessing  
//  source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs  
//  source line number: 31  

Затем возьмите то, что они пометили как source file path, и играйте в игры про пути, чтобы получить пространство имен. Параметры, использующие эти атрибуты, всегда являются необязательными (обычно по умолчанию они имеют значение по умолчанию (T)). Компилятор вводит значение, вызывающий не должен.

...