C#.如何在对象中注入多个依赖项实例?

Iev*_*nov 6 c# dependency-injection

我有以下课程(部分内容):

class SearchViewModel : BaseViewModel<SearchResultItem>
{        
    private readonly IDownloader _downloader;        

    public SearchViewModel( IDownloader downloader)
        : base(model)
    {
        _downloader = downloader;
    }

    private void Download(object sender, DoWorkEventArgs e)
    {
        _downloader.Download(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

我为IDownloader使用了构造函数注入,并且在多线程出现之前它已经运行良好.

_downloader有一个状态,我需要在单独的线程中运行_downloader.Download(item)(用户单击搜索结果页面上的下载按钮).

目标:之前_downloader.Download(item),_downloader应初始化一个新实例.我可以使用_container.Resolve(IDownloader),但它会破坏组合根原则.

我已经创建了讨论最佳解决方案的问题,因为我认为直接初始化(new())或对容器的引用不是答案.

Pau*_*ips 6

为什么不只是手工工厂?这是一种非常常见的依赖注入代码模式.

interface IDownloaderFactory 
{
  IDownloader Create();
}

class DownloaderFactory : IDownloaderFactory 
{
  IDownloader Create()
  {
    // either new it up here, or resolve from the container as you wish.
  }
} 
Run Code Online (Sandbox Code Playgroud)

然后将该工厂注入原始对象.

class SearchViewModel : BaseViewModel<SearchResultItem>
{        
    private readonly IDownloaderFactory _factory;        

    public SearchViewModel( IDownloaderFactory factory)
        : base(model)
    {
        _factory = factory;
    }

    private void Download(object sender, DoWorkEventArgs e) 
    {
        _factory.Create().Download(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您就不依赖于特定于IOC容器的功能.

  • @YevhenMartynov 依赖项_必须_存在 - 没有其他方法可以实例化!“new”或使用容器是您唯一的选择。这是“单一成分根”原则只会给您带来痛苦的情况之一。我建议对规则稍作修改:允许容器在根和工厂中使用,仅此而已。 (2认同)