gpt4 book ai didi

inversion-of-control - 泛型类型依赖注入(inject) : How to inject T

转载 作者:行者123 更新时间:2023-12-01 01:38:18 28 4
gpt4 key购买 nike

我想在我的应用程序中以相同的方式处理不同类型的文档
所以:
我有一个像这样的通用接口(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 之间的“依赖关系”。和一个特定的文档( ReportDocumentMediaDocument ),所以如果你想使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com