Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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# 如何将其转换为工厂/抽象工厂?_C#_Generics_Design Patterns_Migradoc - Fatal编程技术网

C# 如何将其转换为工厂/抽象工厂?

C# 如何将其转换为工厂/抽象工厂?,c#,generics,design-patterns,migradoc,C#,Generics,Design Patterns,Migradoc,我正在使用创建pdf文档 我拥有与中使用的类似的业务实体 对于createRenderer(),我可以使用开关大小写/字典和返回类型 如何根据类型获取/创建渲染器? 我如何在这里使用工厂或抽象工厂 或者哪种设计模式更适合这个问题?您可以使用一个工厂,其中您的键将是类型,本文提供了一些示例 如果您能负担得起使用IoC,最好让IoC引擎根据字符串决定应该使用哪个具体类,您应该相应地配置容器。此字符串可以是类型名称。 我建议,但任何像温莎这样的国际奥委会都可以 下面是一个示例,说明如何使用具有通用接口

我正在使用创建pdf文档

我拥有与中使用的类似的业务实体

对于createRenderer(),我可以使用开关大小写/字典和返回类型

如何根据类型获取/创建渲染器?

我如何在这里使用工厂或抽象工厂


或者哪种设计模式更适合这个问题?

您可以使用一个工厂,其中您的键将是类型,本文提供了一些示例

如果您能负担得起使用IoC,最好让IoC引擎根据字符串决定应该使用哪个具体类,您应该相应地配置容器。此字符串可以是类型名称。 我建议,但任何像温莎这样的国际奥委会都可以

下面是一个示例,说明如何使用具有通用接口的工厂来完成,因为在您的情况下,需要传递constructor

public class Factory<T>
{
    public Factory()
    {
        _Mappings = new Dictionary<string,Func<IInterface<T>>>(2);

        _Mappings.Add("MyClass1", () => new MyClass1() as IInterface<T>);
        _Mappings.Add("MyClass2", () => new MyClass2() as IInterface<T>);
    }
    public IInterface<T> Get(string typeName)
    {
        Func<IInterface<T>> func;
        if (_Mappings.TryGetValue(typeName, out func))
        {
            return func();
        }
        else
            throw new NotImplementedException();
    }

    readonly Dictionary<string, Func<IInterface<T>>> _Mappings;
}

public class MyClass1 : IInterface<int>
{
    public int Method()
    {
        throw new NotImplementedException();
    }
}

public class MyClass2 : IInterface<string>
{
    public string Method()
    {
        throw new NotImplementedException();
    }
}

public interface IInterface<T>
{
    T Method();
}
公共类工厂
{
公共工厂()
{
_映射=新字典(2);
_Add(“MyClass1”,()=>newmyclass1()作为接口);
_Add(“MyClass2”,()=>newmyclass2()作为接口);
}
公共接口获取(字符串类型名)
{
Func Func;
if(_Mappings.TryGetValue(typeName,out func))
{
返回func();
}
其他的
抛出新的NotImplementedException();
}
只读字典映射;
}
公共类MyClass1:接口
{
公共int方法()
{
抛出新的NotImplementedException();
}
}
公共类MyClass2:接口
{
公共字符串方法()
{
抛出新的NotImplementedException();
}
}
公共接口接口
{
T方法();
}

我仍然认为IoC更好,但这是一种有效的方法。

您的界面定义可以得到增强。相反,只需返回泛型并接受作为构造函数的输入,您既可以接受泛型作为输入,也可以返回它

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

请你再解释一下好吗?我无法将文章映射到我的情况。下面是一个工厂使用相同概念但使用类型名称作为键的示例。您应该用您的通用接口替换我的通用接口。您需要在factory get中传递一个额外的参数来填充构造函数。公共类工厂{public factory(){{u Mappings=new Dictionary(2);_Mappings.Add(“MyClass1”,()=>new MyClass1()作为接口);_Mappings.Add(“MyClass2”,()=>new MyClass2()作为接口)}我试图复制代码,但代码太长,我试图将代码分成几块,并抱怨每15秒只有一条评论,我放弃了。如果你提到你的电子邮件,我可以提供详细信息。我修改了答案
            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) 
            }
public class Factory<T>
{
    public Factory()
    {
        _Mappings = new Dictionary<string,Func<IInterface<T>>>(2);

        _Mappings.Add("MyClass1", () => new MyClass1() as IInterface<T>);
        _Mappings.Add("MyClass2", () => new MyClass2() as IInterface<T>);
    }
    public IInterface<T> Get(string typeName)
    {
        Func<IInterface<T>> func;
        if (_Mappings.TryGetValue(typeName, out func))
        {
            return func();
        }
        else
            throw new NotImplementedException();
    }

    readonly Dictionary<string, Func<IInterface<T>>> _Mappings;
}

public class MyClass1 : IInterface<int>
{
    public int Method()
    {
        throw new NotImplementedException();
    }
}

public class MyClass2 : IInterface<string>
{
    public string Method()
    {
        throw new NotImplementedException();
    }
}

public interface IInterface<T>
{
    T Method();
}
public interface IPdfRenderer<T>
{
    T Render(MigraDoc.DocumentObjectModel.Section s, T baseContent);
}
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);
}