Laden...

Service Locator Pattern bringt Fehler bei Mehrfachregistrierung eines Services in versch. Assemblies

Erstellt von jok3r89 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.212 Views
J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren
Service Locator Pattern bringt Fehler bei Mehrfachregistrierung eines Services in versch. Assemblies

Hallo, ich versuche gerade ein Projekt zu verstehen "RoslynPad" weil ich teilweise bei mir davon was Implementieren will

Aber beim besten willen was passiert hier

            var container = new ContainerConfiguration()
                .WithAssembly(typeof(MainViewModelBase).Assembly)   // RoslynPad.Common.UI
                .WithAssembly(typeof(MainView).Assembly);           // RoslynPad
            var locator = container.CreateContainer().GetExport<IServiceProvider>();


            _viewModel = locator.GetService<MainViewModelBase>();

Die Ausnahme die ausgelöst wird bringt mich nämlich auch nicht wirklich weiter.

Fehlermeldung:
System.Windows.Markup.XamlParseException
HResult=0x80131501
Message=Zeilennummer "15" und Zeilenposition "10" von "Durch den Aufruf des Konstruktors für Typ "ThePLCProject.Ui.Editor.Views.MainView", der den angegebenen Bindungseinschränkungen entspricht, wurde eine Ausnahme ausgelöst.".
Source=PresentationFramework
StackTrace:
at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)

Inner Exception 1:
CompositionFailedException: Only one export for the contract 'IServiceProvider' is allowed, but the following parts: 'SystemCompositionServiceProvider', 'SystemCompositionServiceProvider' export it.

Schon mal vielen Dank für die Geduld
Gruß

4.931 Beiträge seit 2008
vor 5 Jahren

Ist das eine Fehlermeldung mit dem original RoslynPad-Projekt? Oder hast du Sourcen davon in dein Projekt übernommen und erhältst dann diesen Fehler?

Durch das WithAssembly wird anscheinend zweimal dieselbe Assembly eingebunden (und dadurch für IServiceProvider die Klasse SystemCompositionServiceProvider zweimal registriert).

Wenn du die Sourcen alle in einer Assembly hast, reicht ein Aufruf von WithAssembly.

P
5 Beiträge seit 2018
vor 5 Jahren

Hallo jok3r89,

die Funktion WithAssembly durchsucht die angegebene Assembly nach Import/Exports Attributen und registriert diese. Die Fehlermeldung deutet auf eine Mehrfachregistrierung hin.

Fehlermeldung:
"**Only one export **for the contract 'IServiceProvider' is allowed, but the following parts: 'SystemCompositionServiceProvider', 'SystemCompositionServiceProvider' export it."

Befinden sich MainView und MainViewModelBase in der gleichen Assembly?

Cheers.

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Hallo,
Der Code wurde angepasst RoslynPad befindet sich jetzt auch im gleichen Projekt.
Wenn ich das richtig verstehe könnte ich dann komplett darauf verzichten?

Edit:


            var container = new ContainerConfiguration()
                .WithAssembly(typeof(MainView).Assembly);           
            var locator = container.CreateContainer().GetExport<IServiceProvider>();

So gehts erst mal.

Also bisher finde ich es doch ganz schön übertrieben komplex so recht sind mir scheinbar die Vorteile noch nicht bewusst...

Vielen Dank fürs Helfen

Gruß