0

Ich verwende Unity, um Dependency Injection in meiner Xamarin Forms-Anwendung zu steuern. Ich habe eine Ansichtsmodellklasse, die eine Eltern-ID und einen Dienst mit eingefügten Einheiten als Konstruktorparameter verwendet.Unity.Resolve für eine Klasse mit einer Abhängigkeitsinjektion

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

Ich habe die Klasse in der Einheit Container registriert.

unityContainer.registerType<BrowseViewModel>(); 

Ich habe auch den Dienst in der Einheit Container registriert.

unityContainer.registerType<IInjectedService, InjectedService>(); 

Meine Frage ist, wie kann ich den Wert für parentId angeben, wenn Unity eine Instanz meiner Klasse erstellt? Ich glaube nicht, dass ich den Parameter injectedService angeben muss, weil ich diese Klasse bereits mit der Einheit registriert habe und es sich um eine Singleton-Klasse handelt.

Antwort

0

Sie müssen BrowseViewModel wie das registrieren:

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

dann in contrutor wo Sie BrowseViewModel verwenden, müssen Sie Func<int, BrowseViewModel> browseViewMdoelFactory und es verwenden, so verwenden:

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

Sie haben ein paar von Optionen.

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

Aber diese Art und Weise haben Sie einen festen Wert für parentId (1234 in diesem Beispiel): Sie können Ihre BrowserViewModel wie folgt registrieren.

Sie könnten auch ein Fabrik-Entwurfsmuster wie so verwenden:

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

Dann injizieren Sie die BrowseViewModelFactory in der Klasse Sie die BrowseViewModel benötigen und die Methode mit den richtigen parentId erstellen nennen. Wie:

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

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

Zusätzlich können Sie die parentId gesetzt, wenn Sie versuchen, BrowserViewModel zu lösen.

Zuerst registrieren Typ:

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

Und dann Art lösen. Hierfür benötigen Sie alle primitiven Typen in Konstruktor außer Kraft zu setzen, wenn versuchen, eine Art zu lösen, so dass Sie ParameterOverrides verwenden können, wie in der Antwort von @Crekate wiesen darauf hin, oder direkt params ParameterOverride wie in dem folgenden Code setzen kann:

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