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())或对容器的引用不是答案.
为什么不只是手工工厂?这是一种非常常见的依赖注入代码模式.
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容器的功能.