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

标签 inversion-of-control c#-2.0 unity-container

我想在我的应用程序中以相同的方式处理不同类型的文档
所以:
我有一个像这样的通用接口(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/

相关文章:

.net - IoC 容器——哪个最好? (。网)

c# - 仅转义 XML 中 Node 的内容

.net - 使用 StructureMap 配置 Prism

unity-container - 统一错误 : The given assembly name or codebase was invalid

c# - 用于动态解析程序集的 Unity IoC

dependency-injection - 我应该在简单注入(inject)器中使用单例注册吗?

c# - Ninject 工厂扩展和 InCallScope 没有给出预期的结果

c# - (DataGridView + Binding)如何根据绑定(bind)的对象给线条上色?

c# - Datagrid 自动向下滚动以选择行 C#

c# - 没有可用的公共(public)构造函数 Unity.Exceptions.InvalidRegistrationException