解耦组件传递结果c#

本文关键字:结果 组件 解耦 | 更新日期: 2023-09-27 18:12:40

我有一个程序,它从客户端接收文件并对文件进行一些操作,并将它们保存在磁盘上或不保存它们。为了解耦作业,我创建了一个名为IFileEditor的接口。每个在文件中做一些事情的组件都应该实现这个接口:

public interface IFileEditor
    {
        string Name { get; set; }
        byte[] Content { get; set; }
        string EditedName { get; set; }
        byte[] EditedConent { get; set; }
        string ComponentName { get; }
        XmlDocument Config { get; set; }
        XmlDocument Result { get; set; }
        void EditFile(byte[] content);
    }

该接口的主要方法是EditFile,它接收文件内容并进行操作,最后可能将结果保存在磁盘上。我编写的样例类是从图像创建缩略图,实现以下接口:

public class ThumbnailCreator : IFileEditor
    {
       public string Name { get; set; }
       public byte[] Content { get; set; }
       public sting EditedName { get; set; }
       public byte[] EditedConent { get; set; }
       public XmlDocument Config { get; set; }
       public XmlDocument Result { get; set; }
       public void EditFile(byte[] content)
       {
          //change the file content and save the thumbnail content in disk
       }
    }

我可能有很多像ThumbnailCreator这样的组件,例如zip内容或其他任何对内容进行操作的组件。

在主程序中,我通过反射加载每个组件。加载它们的实现并不重要,只知道复制主程序。exe旁边的组件的ddl,如果dll实现了IFileEditor,我将其添加到列表中。

主要问题是,主应用程序只是接收文件并将它们传递给组件,组件完成任务。如果我想将一个组件的结果传递给另一个组件,我应该怎么做?

请记住组件之间互不认识,主程序不应该干涉传递结果。

我搜索了一下,我认为责任链设计模式可以解决我的问题。我不知道,对吗?如果正确,如何实现这一点?例如,一个组件创建缩略图并传递结果来压缩缩略图。

我这样写这部分,每个开发人员都可以创建一个组件,主程序可以扩展。

感谢阅读这篇大文。div;)

是的,责任链模式就是您可以用来解决这个设计问题的。您基本上需要确保每个处理器都知道链中的下一个处理器并调用它,并且有某种运行器一次配置处理器链,开始处理操作并收集最终结果。这种模式有很多用例,System.Net.Http.DelegatingHandler (http://msdn.microsoft.com/en-us/library/system.net.http.delegatinghandler(v=vs.110).aspx)就是这样工作的。Java ServletFilters在概念上也是一样的。

你也可以把你的处理器放在一个集合中,迭代这个集合,并通过调用一个特定的方法来应用每个处理器到你的输入,例如在你的例子中EditFile

Update——这里有一个简单的实现来说明我的意思(取自LINQPad):

void Main()
{
    // Variant 1 - Chaining
    var editorChain = new UpperCaseFileEditor(new LowerCaseFileEditor());
    var data1 = new char[] { 'a', 'B', 'c' };
    editorChain.Edit(data1);
    data1.Dump(); // produces ['a','b','c']
    // Variant 2 - Iteration
    var editors = new List<IFileEditor> { new LowerCaseFileEditor(), new UpperCaseFileEditor() };
    var data2 = new char[] { 'a', 'B', 'c' };
    foreach (var e in editors) {
        e.Edit(data2);
    }
    data2.Dump(); // produces ['A','B','C']
}
// Define other methods and classes here
public interface IFileEditor {
    IFileEditor Next { get; set; }
    void Edit(char[] data);
}
public class UpperCaseFileEditor : IFileEditor {
    public IFileEditor Next { get; set; }
    public UpperCaseFileEditor() : this(null) {}
    public UpperCaseFileEditor(IFileEditor next) {
        Next = next;
    }
    public void Edit(char[] data) {
        for (int i = 0; i < data.Length; ++i) {
            data[i] = Char.ToUpper(data[i]);
        }
        if (Next != null)
            Next.Edit(data);
    }
}
public class LowerCaseFileEditor : IFileEditor {
    public IFileEditor Next { get; set; }
    public LowerCaseFileEditor() : this(null) {}
    public LowerCaseFileEditor(IFileEditor next) {
        Next = next;
    }
    public void Edit(char[] data) {
        for (int i = 0; i < data.Length; ++i) {
            data[i] = Char.ToLower(data[i]);
        }
        if (Next != null)
            Next.Edit(data);
    }
}

请考虑到这只是一个说明,我不会声称这将扩展到生产/现实世界的用例:-)。根据您的实际工作,您可能需要改进性能,例如,使用流而不是字节/字符数组可能会非常方便。

解耦组件传递结果c#