我们假设我有以下情况:
我的Downloader
类型有3个依赖关系,例如IDep1
,IDep2
,IDep3
。这些依赖项有2个实现。 IDep1
是Dep1Impl1
和Dep1Impl2
等等。根据Downloader
作为依赖关系的类型,我想用不同的Downloader
实现解析IDep
做这样的事情的最佳做法是什么?为IDep
编写工厂并使用最佳参数调用Downloader
或在DI中尝试条件注册最好?或者有更好的解决方案吗?
编辑:
澄清Downloader
是ASP.NET MVC控制器中的依赖项。在不同的控制器上,我想在IDep
中对Downloader
进行不同的实现。
EDIT2:
我在编译时知道每个Downloader
应该依赖什么依赖项。并且这些依赖关系对于Downloader
依赖的每个控制器是固定的。所以我认为Scott的anwser是解决这类问题的最佳方案。
答案 0 :(得分:1)
如果我理解正确,那里的问题是你想要多个课程依赖Downloader
。依赖Downloader
的类决定了Downloader
接收的依赖类型。
我不认为工厂是一个很好的解决方案,因为
Downloader
的类不应该知道Downloader
Downloader
不应该知道依赖于 it 的内容,以便能够将该细节传递给工厂。你可以这样做,但它会变得错综复杂。你需要一个工厂工厂。
听起来你想要的是预先定义的Downloader
组合 - 一个依赖于一个实现,另一个依赖于另一个实现。
您可以使用Windsor(类似于Unity)这样做:
container.Register(
Component.For<IDownloaderDependency,DownloaderDependencyTypeA>
.Named("DownloaderDependencyTypeA"),
Component.For<IDownloader,Downloader>
.Named("DownloaderForClassA")
.DependsOn(Dependency.OnComponent(
typeof(IDownloaderDependency),
"DownloaderDependencyTypeA")),
Component.For<ClassA>
.DependsOn(Dependency.OnComponent(
typeof(IDownloader),
"DownloaderForClassA"))
)
所以你正在做的是定义Downloader
可以使用特定的依赖类型组合的方式,然后说Downloader
的{{1}}组合用于ClassA
。 / p>
那样ClassA
获得了具有正确依赖关系的正确Downloader
,但从它的角度来看,它所知道的是它依赖于Downloader
。它不会(也不应该)了解 Downloader
中的依赖关系。