C # подход для простой модели плагин / поставщик услуг? (разные коды в зависимости от ...) - PullRequest
0 голосов
/ 02 октября 2009

Каков рекомендуемый подход в C #, когда кто-то хочет реализовать простой подход к плагину?

Так что в основном у меня есть цикл обработки, и я хочу, чтобы в зависимости от того, что выбрал пользователь, происходило различное поведение Допустим, в коде обработки есть два места, для которых логика (код) должна отличаться в зависимости от ввода пользователя. Например, пользователь может выбрать веб-загрузку или загрузку файлов. Поэтому я действительно хочу передать два конкретных метода в цикл обработки для представления

какие-либо предложения о том, кто может реализовать здесь это?

Спасибо

Ответы [ 7 ]

3 голосов
/ 02 октября 2009

Вам действительно нужно (традиционное) плагиновое решение этой проблемы? Лично я так не думаю, для меня это звучит как попытка усложнить решение действительно простой проблемы.

Способ, которым я бы подошел к этому, состоял бы в том, чтобы иметь отдельный класс обслуживания, который отвечает за обработку логики в зависимости от типа загрузки. Имейте перечисление, чтобы определить, какой тип загрузки выбрал пользователь, а затем создайте экземпляр соответствующей конкретной реализации класса обслуживания для выполнения обработки.

public enum FileUploadType
{
    File,
    Web
}

public interface IProcessingService
{
    void Process();
    object GetResults(); // or whatever you want to do with the results of processing
}

public void Process(FileUploadType fileUploadType)
{
    IProcessingService service;

    switch(type)
    {
        case FileUploadType.File: service = new FileUploadProcessingService(); break;
        case FileUploadType.Web: service = new WebUploadProcessingService(); break;
        default: /* log error */ break;
    }

    service.Process();

    /* do something with results of processing */
}

Затем вы можете легко рефакторингить это позже, если решите, что хотите начать использовать контейнер IoC, или внедрить правильный механизм плагинов.

2 голосов
/ 02 октября 2009

Другие люди упомянули Delegates, и если вы сами управляете всем кодом и его функциями, то это лучший подход, однако, если вы действительно хотите использовать систему на основе плагинов , так что ваше приложение предоставляет некоторый API, и вы позволяете сторонним разработчикам писать сборку (обычно DLL), которая будет загружаться и функциональность, используемая вашим приложением, вы можете использовать ряд методов.

Общий подход заключается в том, что ваше приложение (хост-приложение) публикует / предоставляет сборку с определенными интерфейсами. Другие разработчики будут писать свои сборки и обеспечивать, чтобы их классы реализовывали интерфейсы вашего приложения. Затем хост-приложение обычно выполняет перечисление через папку, содержащую сборки «plug-in», и находит сборки, которые определяют класс, реализующий его интерфейс. Затем хост-приложение будет динамически загружать эти сборки и создавать экземпляры классов.

Хорошее руководство по этому общему подходу можно найти здесь:

Плагин Архитектура с использованием C #

Managed Extensibility Framework также является еще одним вариантом для архитектуры плагинов общего назначения, но может оказаться излишним для того, чего вы пытаетесь достичь.

2 голосов
/ 02 октября 2009

Может быть, вы должны увидеть Inversion of Control Pattern (Dependency Injection), которая в основном касается разрешения реализации интерфейса во время выполнения (в нескольких словах).

1 голос
/ 02 октября 2009

Делегаты.

   delegate void DoSomething1(int x, double y);
   delegate int DoSomething2(string s);

   void MainWork(DoSomething1 something1, DoSomething2 something2)
   {
   }

И при вызове MainWork () вы можете подключить некоторые подходящие методы.

   void Do1(int x, double y) {  }
   int Do2(string s) {  }

   MainWork(Do1, Do2);
0 голосов
/ 02 октября 2009

Что не так с if?

Не проще ли что-нибудь подобное?

if (IsCase1(userInput))
{
   ... do case 1 actions
}
else
{
   ... do case2 actions
}

Я бы не усложнял вещи больше, чем нужно. Ключевым моментом здесь является ¿это необходимо? Если вам действительно нужно передать функциональность в качестве параметра, я бы использовал решение Delegates (следующее более простое) и использовал бы только плагины как последнее средство.

Помни принцип KISS!

0 голосов
/ 02 октября 2009

Вы можете использовать делегаты или частичные методы, чтобы разрешить перехват в вашем коде, но это означает, что сборка должна быть перекомпилирована.

0 голосов
/ 02 октября 2009

Вы изучили Microsoft Managed Extensibility Framework ?

Из вступления:

Managed Extensibility Framework (MEF) - это новая библиотека в .NET, которая позволяет повторно использовать приложения и компоненты. Используя MEF, приложения .NET могут перейти от статической компиляции к динамической компоновке. Если вы создаете расширяемые приложения, расширяемые платформы и расширения приложений, тогда MEF для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...