/ / Habe eine modulabhängige Injection for State in PRISM WPF Anwendung - wpf, unity-container, prism, state, mvp

Haben Sie eine modulabhängige Injektion für State in der PRISM WPF-Anwendung - wpf, unity-container, prism, state, mvp

Hallo, wir haben eine PRISM WPF MVP-Anwendung, würden wirmöchten einen Zustand haben, um Daten zwischen den Ansichten in demselben Modul zu teilen. Da PRISM standardmäßig keinen Status hat, fragte ich mich, ob es eine Möglichkeit gibt, dies zu implementieren. Derzeit habe ich einen Zustand mit Dictionary als Back-Store injiziert, aber das Problem ist, dass es global ist, d. H. Über die Module verfügbar. Ich möchte diese Einspritzung wirklich als modulspezifisch betrachten.

Ich glaube, dass Unity die Registrierung verschiedener Klassen auf der Grundlage des Namens für dieselbe Schnittstelle ermöglicht. Ich bin mir nicht sicher, ob ich nur die Wahl habe, diese für mein Szenario zu nutzen.

Jede Hilfe wäre toll! Vielen Dank!

-ioWint

Antworten:

0 für die Antwort № 1

Ich würde zustimmen, dass die Typregistrierung von Scoping Unity mit dem Modulnamen ein Ausgangspunkt wäre.


0 für die Antwort № 2

Injizieren Sie ein lokales (Modulebene) Statusobjekt inAlle Ansichten, die den Freigabestatus haben möchten. Wenn die Schnittstelle, die das Statusobjekt definiert, für Ihr Modul lokal ist, können andere Module nicht auf das Statusobjekt verweisen, da sie nicht auf die Schnittstelle verweisen können.

So: Wenn in Modul A drei Ansichten vorhanden sind, die ein Objekt verwenden, das IStatefulContainer implementiert (auch in Modul A deklariert), und IStatefulContainer nicht nur mit RegisterType, sondern mit RegisterInstance bei Unity registriert ist, wird dem Modul ein Singleton zugewiesen.

Ich würde es vorziehen, einen "Status" -Dienst zu haben, der den Status verwaltet. Dies könnte es Ihnen ermöglichen, hier mehr Funktionalität hinzuzufügen, wenn Sie dies benötigen, und ist ein "prismatischer" Ansatz.

BEARBEITEN


Wenn Sie dieses Statusobjekt über mehrere Module hinweg verwenden, können Sie Folgendes tun:

1) Platzieren Sie die Schnittstelle in einer Assembly, auf die jedes Modul verweist, das sie verwenden möchte.

Versammlung A

public interface IBlah
{
string Add(string stateKey, string stateValue);
}





Assembly B (referencing Assembly A)



public class Module:IModule
{
private IUnityContainer _container;

public Module(IUnityContainer container)
{
_container=container;
}
public void Initialize()
{
IBlah blah1=new BlahContainer();
IBlah blah2=new BlahContainer();
_container.RegisterInstance<IBlah>(blah1,"BlahContainer1");
_container.RegisterInstance<IBlah>(blah2,"BlahContainer2");

}
}

Modul C (Referenzen Baugruppe A)

_container.Resolve<IBlah>("BlahContainer1");
_container.Resolve<IBlah>("BlahContainer2");

Grundsätzlich definieren wir die Schnittstelle in einer BaugruppeWir freuen uns über die gemeinsame Nutzung zwischen Modulen. Einige Projekte verfügen über "Infrastruktur" - oder "Allgemeine Assemblys", die Serviceschnittstellen enthalten, die von anderen Modulen verwendet werden. Dies würde hier gut passen.

Wir haben dann in unserem Modul die Baugruppe mit dem Vertrag darin referenziert.

Im Moment verlasse ich mich hier auf "magische Fäden", aber es gibt viele Möglichkeiten, dies zu umgehen.

Hoffe das ist etwas klarer.


0 für die Antwort № 3

danke für deine aktualisierte lösung. Ich habe versucht, eine namenbasierte Unity-Registrierung zu vermeiden, die meinen Presenter zwingen würde, den Registrierungsschlüssel für den Modulstatus zu kennen. Ich habe Stackoverflow-Posts auf Unity gelesen und die Diskussion hier gefunden Ist es möglich, Parameterwerte bei Verwendung von Method Injection mit Unity zu überschreiben? .

Nach ein paar Stunden Versuch und Irrtum erreichte ich die gewünschte Funktionalität.

Was habe ich getan:

Ich habe eine BaseClass für meine Module -> BaseModule:IModul enthält eine State-Eigenschaft, die meinem in der Infrastructure.Interface definierten IStateService entspricht. Ich instanziiere diese State-Eigenschaft im BaseModule () -Konstruktor. Hinweis: Um mit diesem Ansatz zu arbeiten, muss der Presenter einen öffentlichen IStateService-Status haben.

Zum Zeitpunkt der Registrierung des Presenters im Modul spezifiziere ich

<UnityContainer>.RegisterType<MyPresenter, new InjectionProperty("State", State).

Überschreibe eine öffentliche Eigenschaft in PresenterDer Name lautet "State" mit dem im Modul definierten Wert für die State-Instanz. Auf diese Weise kann ich den Modulstatus als den Status für jeden der View-Präsentatoren abrufen.

Vielen Dank, dass Sie mich auf eine Lösung aufmerksam gemacht haben.

-ioWint