Iev*_*nov 8 c# dependency-injection unity-container
我有以下代码:
_container = new UnityContainer();
_container.RegisterType<IDownloader, Downloader>();
_container.RegisterType<INewObject, NewObject>();
_container.RegisterType<SearchViewModel>();
Run Code Online (Sandbox Code Playgroud)
SearchViewModel 构造函数注入的类:
class SearchViewModel
{
private readonly Func<IDownloader> _downloaderFactory;
private readonly INewObject _newObject;
private IDownloader _downloader;
public SearchViewModel(Func<IDownloader> downloaderFactory, INewObject newObject)
{
_downloaderFactory = downloaderFactory;
_newObject = newObject;
}
}
Run Code Online (Sandbox Code Playgroud)
问题:如何注册SearchViewModel那个Fun<>参数?
_container.RegisterType<SearchViewModel>(new InjectionConstructor(DownloaderFactory()));
Run Code Online (Sandbox Code Playgroud)
上面的代码只能没有INewObject.
目标:自动解决工厂InjectionConstructor并INewObject, INewObject2, INewObject3自动解决(如无参数:) RegisterType<SearchViewModel>().
可能吗?也许是替补?
Iev*_*nov 14
我解决了这个问题:
_container.RegisterType<Func<IDownloader>>(new InjectionFactory(i =>
new Func<IDownloader> (() => _container.Resolve<IDownloader>())));
_container.RegisterType<SearchViewModel>();
Run Code Online (Sandbox Code Playgroud)
新的Func是关键,因为在我尝试之前:
_container.RegisterType<Func<IDownloader>>(new InjectionFactory(i =>
_container.Resolve<IDownloader>()));
Run Code Online (Sandbox Code Playgroud)
也是更好的方式来IDownloaderFactory代替Func<IDownloader> downloaderFactory.IDownloaderFactory可以封装委托.
另外我认为使用委托作为工厂内的依赖是比破坏的Composition Root更好的解决方案.
| 归档时间: |
|
| 查看次数: |
6538 次 |
| 最近记录: |