C#类接口设计

C#类接口设计,c#,model-view-controller,interface,itextsharp,C#,Model View Controller,Interface,Itextsharp,我正试图为我的项目使用的iTextsharp(PDF创建库)设计一个界面。我不想在我的项目中引用iTextsharp,只想引用接口 比如说,我有 interface IPdfTable { /* */ } public class PdfTable : IPdfTable { /* */ } interface IPdfCell { /* */ } public class PdfCell : PdfCell { /* */ } 虽然我可以轻松地为每

我正试图为我的项目使用的iTextsharp(PDF创建库)设计一个界面。我不想在我的项目中引用iTextsharp,只想引用接口

比如说,我有

     interface IPdfTable { /* */ }
     public class PdfTable : IPdfTable  { /* */ }

     interface IPdfCell { /* */ }
     public class PdfCell : PdfCell { /* */ }
虽然我可以轻松地为每个类单独构建接口,但当这些类相互交互时,我在实现上遇到了困难。在代码的某个地方,我需要能够接受单元格集合的表

当我有一个单元格集合,需要将其添加到表中时,问题就出现了。不知何故,我需要将IPdfCell转换为库(iTextSharp)接受的原始元素。我相信快速简单的实现是向下投射,但不是一个好的设计

我能想到的唯一其他解决方案是使用接口收集各种设置,并在传递到其他元素时动态创建原始元素(iTextsharp接受)


有更好的实现吗?

通常,您会有一个转换层,将接口facade实现转换为iTextSharp本机支持的类型


若您需要属性到属性的映射,AutoMapper可以为此提供帮助,并且可以为您删除大量翻译工作

通常,您会有一个转换层,将接口facade实现转换为iTextSharp本机支持的类型


若您需要属性到属性的映射,AutoMapper可以为此提供帮助,并且可以为您删除大量翻译工作

我不理解这样一个界面的目的。不管怎样,pdf生成代码都将绑定到您正在使用的库,构建完全镜像库的代理类/接口并不能阻止这一点,它只是添加了另一层。如果您要切换到另一个PDF生成库,那么新库极不可能与iText中的等效库1:1匹配,而且最终还是会更改接口并调用代码

我的建议是创建一个
IPDFGenerator
,然后创建一个耦合到iText的
iTextPDFGenerator:IPDFGenerator
,并保持不变。您将拥有想要的分离,能够将iText排除在核心服务之外,但它不需要在相同的类之间进行大量无意义的映射


我认为你应该重新评估S、I和D,确保你没有做得太多。

我不理解这样一个接口的目的。不管怎样,pdf生成代码都将绑定到您正在使用的库,构建完全镜像库的代理类/接口并不能阻止这一点,它只是添加了另一层。如果您要切换到另一个PDF生成库,那么新库极不可能与iText中的等效库1:1匹配,而且最终还是会更改接口并调用代码

我的建议是创建一个
IPDFGenerator
,然后创建一个耦合到iText的
iTextPDFGenerator:IPDFGenerator
,并保持不变。您将拥有想要的分离,能够将iText排除在核心服务之外,但它不需要在相同的类之间进行大量无意义的映射


我认为你应该重新评估S、I和D的实数,并确保你没有做得太多。

这一点很好。与将pdf生成库封装在一组接口中相比,更好的方法可能是将pdf生成封装在一个服务接口中。与其将pdf生成库封装在一组接口中,不如将pdf生成封装在服务接口中。