C#.如何在对象中注入多个依赖项实例?
发布时间:2020-12-15 08:27:34 所属栏目:百科 来源:网络整理
导读:我有以下课程(部分内容): class SearchViewModel : BaseViewModelSearchResultItem{ private readonly IDownloader _downloader; public SearchViewModel( IDownloader downloader) : base(model) { _downloader = downloader; } private void Download(obj
我有以下课程(部分内容):
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); } } 我为IDownloader使用了构造函数注入,并且在多线程出现之前它已经运行良好. _downloader有一个状态,我需要在单独的线程中运行_downloader.Download(item)(用户单击搜索结果页面上的下载按钮). 目标:在_downloader.Download(item)之前,应该初始化_downloader的新实例.我可以使用_container.Resolve(IDownloader),但它会破坏Composition Root原则. 我已经创建了讨论最佳解决方案的问题,因为我认为直接初始化(new())或对容器的引用不是答案. 解决方法
为什么不只是手工工厂?这是一种非常常见的依赖注入代码模式.
interface IDownloaderFactory { IDownloader Create(); } class DownloaderFactory : IDownloaderFactory { IDownloader Create() { // either new it up here,or resolve from the container as you wish. } } 然后将该工厂注入原始对象. 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); } } 这样,您就不依赖于特定于IOC容器的功能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |