Unity.Resolve 对于具有依赖项注入的 class

Unity.Resolve for a class with a dependency injection

我在我的 Xamarin Forms 应用程序中使用 Unity 来控制依赖注入。我有一个视图模型 class,它将父 ID 和一个统一注入服务作为构造函数参数。

public class BrowseViewModel {
    public BrowseViewModel(int parentId, IInjectedService injectedService) {
    }
}

我已经在unity容器中注册了class

unityContainer.registerType<BrowseViewModel>();

我在unity容器里也注册了服务

unityContainer.registerType<IInjectedService, InjectedService>();

我的问题是,当 Unity 创建我的 class 实例时,如何指定 parentId 的值?我认为我不必指定 injectedService 参数,因为我已经统一注册了这个 class 并且它是一个单例 class.

您需要这样注册BrowseViewModel

container.RegisterType<Func<int, BrowseViewModel>>(
                new InjectionFactory(c =>
                    new Func<int, BrowseViewModel>(id=> c.Resolve<BrowseViewModel>(new ParameterOverrides { { "parentId", id},))));

然后在你使用Browse ViewModel的contrutor中,你需要使用Func<int, BrowseViewModel> browseViewMdoelFactory 并像这样使用它:

class SomeViewClass
{
    SomeViewClass(Func<int, BrowseViewModel> browseViewMdoelFactory)
    {    
    browsceViewModelFactory(parentId);
    }
}

你有几个选择。您可以像这样注册您的 BrowserViewModel:

unityContainer.RegisterType<BrowseViewModel>(new InjectionFactory(c => new BrowseViewModel(1234, c.Resolve<IInjectedService>())));

但是这样你就有了 parentId 的固定值(本例中为 1234)。

您也可以像这样使用工厂设计模式:

public class BrowseViewModelFactory
{
    private IInjectedService _injectedService;
    public BrowseViewModelFactory(IInjectedService injectedService)
    {
        _injectedService = injectedService;
    }
    public BrowseViewModel CreateBrowseViewModel(int parentId)
    {
        return new BrowseViewModel(parentId, _injectedService);
    }
}

然后你在 class 中注入 BrowseViewModelFactory 你需要 BrowseViewModel 并使用正确的 parentId 调用创建方法。喜欢:

public class SomeOtherClass
{
    private BrowseViewModelFactory _browseViewModelFactory;
    public SomeOtherClass(BrowseViewModelFactory browseViewModelFactory)
    {
        _browseViewModelFactory = browseViewModelFactory;
    }

    public void DoStuff()
    {
        var browseViewModel = _browseViewModelFactory.CreateBrowseViewModel(4321);
    }
}

此外,您可以在尝试解析 BrowserViewModel 时设置 parentId

一开始只要注册类型:

        container.RegisterType<BrowseViewModel>();
        // Mark that InjectedService is the singleton using ContainerControlledLifetimeManager
        container.RegisterType<IInjectedService, InjectedService>(new ContainerControlledLifetimeManager());

然后解析类型。为此,您需要在尝试解析类型时覆盖构造函数中的所有原始类型,因此您可以使用 ParameterOverrides 正如@Crekate在答案中指出的那样,或者可以直接将 params ParameterOverride 放在下面的代码中:

        var vm = container.Resolve<BrowseViewModel>(new ParameterOverride("parentId", 546));