当我想在不同类型上解决不同实现的依赖关系时,我应该在DI中编写工厂还是使用条件注册?

时间:2016-03-30 11:56:05

标签: .net dependency-injection inversion-of-control autofac simple-injector

我们假设我有以下情况:

我的Downloader类型有3个依赖关系,例如IDep1IDep2IDep3。这些依赖项有2个实现。 IDep1Dep1Impl1Dep1Impl2等等。根据Downloader作为依赖关系的类型,我想用不同的Downloader实现解析IDep

做这样的事情的最佳做法是什么?为IDep编写工厂并使用最佳参数调用Downloader或在DI中尝试条件注册最好?或者有更好的解决方案吗?

编辑:

澄清Downloader是ASP.NET MVC控制器中的依赖项。在不同的控制器上,我想在IDep中对Downloader进行不同的实现。

EDIT2:

我在编译时知道每个Downloader应该依赖什么依赖项。并且这些依赖关系对于Downloader依赖的每个控制器是固定的。所以我认为Scott的anwser是解决这类问题的最佳方案。

1 个答案:

答案 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中的依赖关系