解耦组件传递结果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);
}
}
请考虑到这只是一个说明,我不会声称这将扩展到生产/现实世界的用例:-)。根据您的实际工作,您可能需要改进性能,例如,使用流而不是字节/字符数组可能会非常方便。