如何注册一个以`Func <>`作为参数的类?

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.

目标:自动解决工厂InjectionConstructorINewObject, 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更好的解决方案.