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