2013-11-18 2 views
2

У меня есть приложение WPF, которое я начинаю разрабатывать. У меня есть 40 или около того методов, которые доступны через пользовательский интерфейс, но также должны выполняться путем передачи параметров через командную строку.WPF командной строки Аргумент маршрутизации

В настоящее время у меня есть следующие, что позволяет мне поймать аргументы на App.xaml.cs ...

public partial class App : Application 
    { 
    string[] args = MyApplication.GetCommandLineArgs(); 

    Dictionary<string, string> dictionary = new Dictionary<string, string>(); 

    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     for (int index = 1; index < args.Length; index += 2) 
     { 
      dictionary.Add(args[index], args[index + 1]); 
     } 

     if (dictionary.Keys.Contains("/Task")) 
     { 
      MessageBox.Show("There is a Task"); 

     } 
    } 
} 
} 

Ищу передать аргумент в начале каждого вызова с помощью команды линия. Если я прохожу

/Задача ThisIsTheTask

Я могу прочитать это из словаря. Затем выполните соответствующий метод.

Мой вопрос - это лучший способ «маршрутизации» параметра задачи конкретному методу. Я также буду передавать дополнительные параметры после задачи, которая должна быть передана методу.

ответ

1

Это может рассматриваться как реализация сервис локатора антишаблоном, но один простой подход будет иметь что-то вроде следующего:

private readonly Dictionary<string, Action<string[]>> commands = new Dictionary<string, Action[]> 
{ 
    {"Task1", args => Task1Method(args[0], Int32.Parse(args[1]))} 
} 

private static Task1Method(string firstArgs, int secondArg) 
{ 
} 

ваш код может определить местонахождение Action<string[]> для выполнения задачи, указанной в командной строке и передать оставшиеся параметры в Action, например

var commandLineArgs = Environment.GetCommandLineArgs(); 
var taskName = commandLineArgs[1]; 

// Locate the action to execute for the task 
Action<string[]> action; 
if(!commands.TryGetValue(taskName, out action)) 
{ 
    throw new NotSupportedException("Task not found"); 
} 

// Pass only the remaining arguments 
var actionArgs = new string[commandLineArgs.Length-2]; 
commandLineArgs.CopyTo(actionArgs, 2); 

// Actually invoke the handler 
action(actionArgs); 
0

Я предлагаю один (или несколько) свойств класса приложения вашей программы, который их выставляет. Доступ во время выполнения может быть выполнен с помощью чего-то вроде

(Application.Current as App).MyTask 

, который затем может быть дополнительно упакован для удобства. Кроме того, вы можете написать собственный метод «Главная» в WPF - таким образом, вам будет проще получить доступ к массиву параметров и выполнить обработку до запуска WPF, если вам нужно. Я отредактирую, как вам это нужно.

1

Если вы можете использовать сторонние библиотеки с открытым исходным кодом, я бы предложил взглянуть на ManyConsole, он доступен через NuGet here.

ManyConsole позволяет определить ConsoleCommand реализации (см. here для примера реализации), который может иметь много параметров. Затем вы можете использовать ConsoleCommandDispatcher для перехода к соответствующей реализации ConsoleCommand на основе аргументов командной строки (см. Пример here).

Я никоим образом не связан с ManyConsole, но я использовал библиотеку и нашел ее очень эффективной.

+0

Выглядит хорошо @Луказоид, к сожалению, я не могу использовать любую стороннюю библиотеку. Спасибо хоть. Ill закладки, что на будущее :-) – MrBeanzy

+1

@MrBeanzy Ах, это позор, надеюсь, что вы можете получить вдохновение от проекта, я оставлю этот ответ здесь, если кто-то еще найдет полезную информацию. – Lukazoid

Смежные вопросы