Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用不同的渲染策略将pdf渲染解耦到可重用程序集/应用程序集_C#_Design Patterns_Application Design - Fatal编程技术网

C# 使用不同的渲染策略将pdf渲染解耦到可重用程序集/应用程序集

C# 使用不同的渲染策略将pdf渲染解耦到可重用程序集/应用程序集,c#,design-patterns,application-design,C#,Design Patterns,Application Design,我们有两个应用程序:桌面客户端和mvc后端。这两个应用程序都有打印功能。很明显,我们在重复这一点。让我解释一下。例行程序如下所示: 用户输入其ID/将其数据发送到mvc端点 我们检查数据库是否所有必要的数据都有效 我们构建了一个viewmodel(mvc)/dto(desktop)对象 要求打印两种类型的文件 然后,我们对构成两个文档的PDF呈现API(我们使用PdfSharp)进行相同的调用 我认为如果我们在一个单独的程序集中使用pdf编写逻辑会更好。这样它就可以重复使用。问题是文档使用的属性

我们有两个应用程序:桌面客户端和mvc后端。这两个应用程序都有打印功能。很明显,我们在重复这一点。让我解释一下。例行程序如下所示:

  • 用户输入其ID/将其数据发送到mvc端点
  • 我们检查数据库是否所有必要的数据都有效
  • 我们构建了一个viewmodel(mvc)/dto(desktop)对象
  • 要求打印两种类型的文件
  • 然后,我们对构成两个文档的PDF呈现API(我们使用PdfSharp)进行相同的调用
  • 我认为如果我们在一个单独的程序集中使用pdf编写逻辑会更好。这样它就可以重复使用。问题是文档使用的属性(数据)略有不同。作为解决方案,我们可以使用一个具有所有必要属性的共享dto:

    public IEnumerable<string> Render(DocumentDto document) {
        // ioc
        foreach(var strategy in this.strategies) {
            if(strategy.CanRender(document)) {
                yield strategy.Render(document);
            }
        }
    }
    
    但我认为这也不是一个好的解决方案,因为它需要一个db依赖项


    我们是否可以将其设计为每个策略只使用其自己的属性集?

    为什么不直接将数据传递到渲染方法中,而不是使用DB依赖项?@James_Parsons你能说明/扩展你的建议吗?基本上,不管你的域模型是什么,都可以(因为我不知道,让我们假设一个db调用返回一个
    IEnumerable
    ,然后让
    Render
    方法直接接受该数据,即,
    Render(IEnumerable)
    这样,唯一的依赖项是域模型,而不是数据库直接依赖项。您如何创建一个呈现服务,将不同的文档类型作为不同的重载,并应用正确的策略?由于MCV部分和桌面客户端部分的类型不同,您可以使用类型系统来处理c选择正确的方法,如果你使用overloads@James_Parsons很好,但是所需的数据跨越多个实体。
    public class StrategyA {
        // I'll omit ctor here
        private DbContext db;
        public string Render() {
            // make db calls
            // render the document
        }
    }