我想在我的应用程序中以相同的方式处理不同类型的文档
所以:
我有一个像这样的通用接口(interface)。
public interface IDocHandler<T>where T: class
{
T Document { get;set;}
void Load(T doc);
void Load(string PathToDoc);
void Execute();
void Execute(T doc);
}
对于不同类型的文档,我实现了这个接口(interface)。
例如:
public class FinanceDocumentProcessor:IDocumentHandler<ReportDocument>
{}
public class MarketingDocumentProcessor:IDocumentHandler<MediaDocument>
{}
然后我当然可以做这样的事情:
IDocumentHandler<ReportDocument> docProc= new FinanceDocumentProcessor();
知道如何在运行时注入(inject) T 以使上面的行松散耦合会很有趣...
IDocumentHandler<ReportDocument> docProc = container.resolve("FinanceDocumentProcessor());
但我想根据配置来决定我想要我的 FinanceDomcumentProcessor 还是我的 MarketingDocumentProcessor...因此我也必须在左侧站点上注入(inject) T...
因为我必须使用 c# 2.0,所以我不能使用魔术词“var”,这在这种情况下会有很大帮助......但是我怎样才能将它设计为开放和灵活......
很抱歉造成误解并感谢所有评论,但我有另一个挑战示例(也许我为此使用了错误的设计)......
但我试一试:同样的情况但不同的解释
我有的示例图像:
ReportingService、Crystal、ListAndLabel
三种不同的报告文件类型。我有一个通用处理程序
IReportHandler<T>
(将与上述相同)此处理程序提供处理报告文档的所有功能。例如
ChrystalReportHandler:IReportHandler<CrystalReportDocument>
现在我想使用 Unity 之类的框架(或其他框架)进行依赖注入(inject),以通过配置决定是否要使用 Crystal,
Reportingservices
或列表和标签。当我指定我的映射时,我可以注入(inject)我的
ChrystalReportHandler
但是我怎样才能在左侧或更好的词中注入(inject) T 类型 ReportDocument
.IReportHandler<T (this needs also to be injected)> = IOContainer.Resolve(MyMappedType here)
我的问题当然是左侧站点,因为它与类型耦合,但我有我的映射......是否可以基于映射生成对象并分配映射类型?或者基本上也将 T 注入(inject)左侧?
还是这种方法不适合这种情况。
最佳答案
我认为使用您当前的设计,您正在创建 IDocumentHandler
之间的“依赖关系”。和一个特定的文档( ReportDocument
或 MediaDocument
),所以如果你想使用 IDocumentHandler<ReportDocument or MediaDocument>
直接在您的代码中,您必须假设您的容器会为您提供。在这种情况下,容器不应该负责解析文档类型。
你会考虑像这样改变你的设计吗?
public interface IDocumentHandler
{
IDocument Document { get; set; }
void Load(IDocument doc);
void Load(string PathToDoc);
void Execute();
void Execute(IDocument doc);
}
public class IDocument { }
public class ReportDocument : IDocument { }
public class MediaDocument : IDocument { }
public class FinanceDocumentProcessor : IDocumentHandler { }
public class MarketingDocumentProcessor : IDocumentHandler { }
关于inversion-of-control - 泛型类型依赖注入(inject) : How to inject T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/355473/