0

MigraDocを使用して PDF ドキュメントを作成しています。

MigraDocで使用されているものと同様のビジネス エンティティがあります。

    public class Page{
      public List<PageContent> Content { get; set; } 
    }


  public abstract class PageContent {

        public int Width { get; set; }      
        public int Height { get; set; } 
        public Margin Margin { get; set; }
    }

    public class Paragraph : PageContent{
         public string Text { get; set; }    
    }

    public class Table : PageContent{
         public int Rows { get; set; }    
         public int Columns { get; set; }  
        //.... more
    }

私のビジネス ロジックでは、各タイプのレンダリング クラスがあります。

public interface IPdfRenderer<T>
{
    T Render(MigraDoc.DocumentObjectModel.Section s);
} 

class ParagraphRenderer
    : IPdfRenderer<MigraDoc.DocumentObjectModel.Paragraph>
{
    BusinessEntities.PDF.Paragraph paragraph;

    public ParagraphRenderer(BusinessEntities.PDF.Paragraph p)
    {
     paragraph = p;
    }

    public MigraDoc.DocumentObjectModel.Paragraph Render(MigraDoc.DocumentObjectModel.Section s)
    {
        var paragraph = s.AddParagraph(); // add text from paragraph etc
        return paragraph;
    }
}


public class TableRenderer : IPdfRenderer<MigraDoc.DocumentObjectModel.Tables.Table>
{
    BusinessEntities.PDF.Table table;
    public TableRenderer(BusinessEntities.PDF.Table t)
    {
        table =t;
    }
    public MigraDoc.DocumentObjectModel.Tables.Table Render(Section obj)
    {
        var table = obj.AddTable();
        //fill table based on table
    }
}

PDFページを次のように作成したい:

            var document = new Document();
            var section = document.AddSection();// section is a page in pdf
            var page = GetPage(1); // get a page from business classes
            foreach (var content in page.Content)
            {
                      //var renderer = createRenderer(content); //
                     // get Renderer based on Business type ??
                     // renderer.Render(section) 
            }

createRenderer() の場合、ケース/辞書の切り替えと戻り値の型を使用できます。

タイプに基づいて一般的にレンダラーを取得/作成するにはどうすればよいですか?

ここでファクトリまたは抽象ファクトリを使用するにはどうすればよいですか?

または、どの設計パターンがこの問題に適しているでしょうか?

4

2 に答える 2

1

インターフェイス定義を拡張できます。ジェネリックを返し、入力をコンストラクターとして受け入れるだけでなく、ジェネリックを入力として受け入れ、それを返すこともできます。

public interface IPdfRenderer<T>
{
    T Render(MigraDoc.DocumentObjectModel.Section s, T baseContent);
}

次に、arutromonrivの答えを展開すると、

public class DynamicRenderer : IPdfRenderer<PageContent>
{
    public DynamicRenderer(IPdfRenderer<Paragraph> paragraph
        , IPdfRenderer<Table> table){
        //variable assignment
    }
    public PageContent Render(MigraDoc.DocumentObjectModel.Section s, PageContent baseContent){
        if(baseContent is Paragraph){ return paragraph.Render(s, baseContent as Paragraph); }
        else{ return table.Render(s, baseContent as Table); }
    }
}

これにより、次のことができます。

var renderer = createRenderer(); //
foreach (PageContent content in page.Content)
{
    // get Renderer based on Business type ??
    renderer.Render(section, content);
}
于 2013-10-18T09:53:10.680 に答える