对于一个简单的插件/服务提供商模式C#的方法呢? (根据不同的代码...)(C# approac

2019-10-29 19:07发布

什么是用C#当一个人想要实现一个简单的插件方式的recoomended的方法呢?

所以基本上我有,我想不同的行为取决于用户选择什么occrur处理循环。 比方说,有在处理代码,其逻辑(代码)必须根据用户的输入不同的两个地方。 例如,用户可以选择基于Web或基于文件的上传。 所以,我真的有种想两个具体方法传递到处理循环来表示

任何建议重新谁实现东西在这里?

谢谢

Answer 1:

你真的需要一个(传统)基于插件的解决这个问题? 我个人不这么认为,这听起来好像试图在解决什么是真正一个简单的问题复杂化。

我将接近这个问题的方法,是将有一个单独的服务类,这是负责处理根据上载的类型的逻辑。 有一个枚举来定义用户选择什么类型的上传,然后实例相关的具体实现服务类做处理。

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容器,或引入适当的插件机制。



Answer 2:

也许你应该看到控制模式(依赖注入),它基本上是有关解决(在极少数的话)的界面在运行时执行的反转。



Answer 3:

其他人提到Delegates ,如果你控制所有的代码和功能自己,这是最好的方法,但是,如果你真的想要一个插件的系统,这样您的应用程序暴露了一些API,你允许第三方开发人员能够编写将被加载,并通过您的应用程序所消耗的功能,你可以使用多种方法的组件(通常是一个DLL)。

一般的做法是,你的应用程序(主机应用程序)将发布/特定接口公开的组件。 其他开发人员编写自己的组件,并确保它们的类实现应用程序的接口。 主机应用程序将通常是通过包含“插件”组件和认定,定义实现了接口的类组件的文件夹枚举。 然后,主机应用程序将动态加载的那些组件和实例化的类。

这个一般方法的一个很好的教程,可以在这里找到:

使用C#插件体系结构

该托管扩展性框架 ,也为一般用途的插件架构另一种选择,但可能是矫枉过正你想达到的目标。



Answer 4:

Delegates.

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

   void MainWork(DoSomething1 something1, DoSomething2 something2)
   {
   }

And when calling MainWork(), you can plug in some appropriate methods.

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

   MainWork(Do1, Do2);


Answer 5:

你有没有在微软的托管扩展性框架 ?

从介绍:

托管扩展框架(MEF)是.NET中,使应用程序和组件更多的重用一个新库。 使用MEF,.NET应用程序可以被静态编译,动态组成的转变。 如果您正在构建扩展的应用程序,可扩展的框架和应用扩展,那么MEF是给你的。



Answer 6:

你可以使用委托,或部分方法来允许挂上你的代码,但这些意味着组件必须重新编译。



Answer 7:

什么是错的if

不会是简单的类似的东西?

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

我不会的东西超过必要的复杂化。 这里的关键点是¿有必要吗? 如果你真的需要传递的功能参数,我会用代表溶液(下一个简单的一个),并只去插件作为最后的手段。

记住KISS原则!



文章来源: C# approach for a simple plugin/service provider model? (different code depending on…)