0

我正在使用Unity来控制Xamarin Forms应用程序中的依赖注入。我有一个视图模型类,它接受父id和统一注入服务作为构造函数参数。Unity.Resolve对于具有依赖项注入的类

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

我已经在统一容器中注册了这个类。

unityContainer.registerType<BrowseViewModel>(); 

我也注册了统一容器中的服务。

unityContainer.registerType<IInjectedService, InjectedService>(); 

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

回答

0

您需要注册BrowseViewModel这样的:

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

然后在你使用BrowseViewModel contrutor,你需要使用Func<int, BrowseViewModel> browseViewMdoelFactory 并使用它像:

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

你有几个的选项。你可以这样注册BrowserViewModel:

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

但这种方式你(在本例1234)为parentId一个固定值。

你也可以使用一个工厂设计模式,像这样:

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

然后你在课堂上注入BrowseViewModelFactory您需要的BrowseViewModel并调用与正确的parentId create方法。像:

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

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

此外,您可以设置parentId当您尝试解决BrowserViewModel

起初,只是注册类型:

 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));