Laden...

Ähnliche/Gleiche Funktion von WCF-Services in Projekt zusammenfassen - Welche Architektur?

Erstellt von emuuu vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.635 Views
emuuu Themenstarter:in
286 Beiträge seit 2011
vor 7 Jahren
Ähnliche/Gleiche Funktion von WCF-Services in Projekt zusammenfassen - Welche Architektur?

Nabend zusammen,

ich habe mal eine grundsätzliche Frage zu WCF-Services, dazu folgendes Szenario:
Ich habe eine Projektmappe in der drei Projekte sind:

  • Core
  • InnerService
  • OuterService

In Core liegen meine DataContracts für beide Service und diverse Klassen/Methoden (Verschlüsselungslogik usw.)

Ich habe nun den Fall, dass einige OperationContracts in beiden Services gleich heißen und auch ziemlich genau das gleiche machen.
Das würde ich nun gerne (in Core) zusammenlegen, also dass für Login() z.B. beides Services den gleichen Code verwenden.

Exemplarisch ist das bisher so aufgebaut:

Core


namespace Core
{
     [DataContract]
     public class LoginToken
     {
       //members
     }
}

Inner:


using Core;
namespace Inner
{
        [ServiceContract]
        public interface IInnerService
        {
            [OperationContract]
            bool Login(LoginToken token);
        }

        public class InnerService: IInnerService
        {
            public bool Login(LoginToken token)
            {
                 //do stuff
            }
         }
}

Outer:


using Core;
namespace Outer
{
        [ServiceContract]
        public interface IOuterService
        {
            [OperationContract]
            bool Login(LoginToken token);
        }

        public class OuterService: IOuterService
        {
            public bool Login(LoginToken token)
            {
                 //do the same stuff
            }
         }
}

Meine erste Idee wäre den Login-Code in Core zu verschieben und von dort in den Services aufzurufen.
Mein Bauch sagt mir aber, dass das nicht die eleganteste Lösung wäre. Und was wäre formal der richtige Ansatz?

Beste Grüße und einen schönen Start ins Wochenende
Timm

2+2=5( (für extrem große Werte von 2)

16.842 Beiträge seit 2008
vor 7 Jahren

Erste Frage: warum überhaupt noch WCF und nicht ordentliches REST mit ASP.NET (Core) / NancyFX?

An für sich macht es natürlich Sinn, gemeinsame Funktionalitäten auch in einem gemeinsamen Projekt (jeweils mit eigenem Deployment) umzusetzen.
=> Modularität.

Ich bin übrigens kein Freund von alleinstehenden Bezeichnern wie "Core", "Common", "Manager"... das geht auch ordentlich.
Solche Bezeichner enden in 99,9% in Inkompatibilität, Code-Allerlei und Co.

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 7 Jahren

Stumpf gesagt: Weil ich WCF kann und und REST nicht und aktuell nicht die Zeit finde mich in das eine einzuarbeiten und das andere entsprechend umzustellen.

Zu den Bezeichnern: Die habe bei mir alle firmen-/projektgebunde Präfixe.

Zur eigentlichen Frage aber:
Was wäre die formal beste Umsetzung?
Eine statische Klasse mit statischen Methoden in Core wäre wahrscheinlich die simpelste Lösung, erscheint mir aber wie gesagt nicht als der beste Weg.

2+2=5( (für extrem große Werte von 2)

C
2.122 Beiträge seit 2010
vor 7 Jahren

Ich muss echt grinsen bei der Antwort.
Kaum kann man was, könnte man schon wieder was neues lernen und alles alte umstellen. Mich würde interessieren wann ein Entwickler für ein Unternehmen die Grenze überschreitet zwischen "wow der kann aber viel" und "der ist nicht mehr produktiv weil er vor lauter lernen keine Zeit mehr hat etwas umzusetzen".

16.842 Beiträge seit 2008
vor 7 Jahren

WCF kann auch REST; nimmt man aber schon ewig nicht mehr, weil die Technologie dafür strukturell wie auch inhaltlich völlig überholt ist.
WCF wurde schon vor ~5 Jahren von ASP.NET WebAPI in Sachen REST abgelöst (und davor gabs schon NancyFX).

WCF hat eigentlich nur noch Verwendung bei Process<>Process Kommunikation.
Für alles andre gibts bessere Alternativen (wobei selbst bei Process<>Process würde ich eher Protobuf verwenden).

Gut gemeinter Rat: wird Zeit, was neues zu lernen 😉
Auch aus langfristiger Sicht für die Firma..

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 7 Jahren

Herje und wenn ich in einem Jahr ne Frage zu asp.net poste kommt wieder wer daher und erklärt mir wie veraltet das ist.. ich kann absolut nachvollziehen Wieso Thyssen Millionen an Microsoft gezahlt hat um den Win Xp-Support aufrecht zu erhalten...

Noch mal zu meiner Frage...?

2+2=5( (für extrem große Werte von 2)

16.842 Beiträge seit 2008
vor 7 Jahren

Ganz ehrlich: mit der Einstellung überholt Dich in Sachen Wissen und Zukunftssicherheit jeder Student heutzutage.
Die meisten Firmen würden auch keine Mitarbeiter mit so einer Einstellung in der Entwicklung einstellen - meiner Meinung zurecht; denn es heisst nicht umsonst "Entwicklung". Mit der Einstellung hätten wir heute noch Kutschen.

Wir reden hier auch nicht von einer Fancy-Future Technologie, die erst in 5 Jahren relevant wird, sondern wir reden vom Alltag.
Im Gegenteil: wir reden hier von einer Situation, bei der es seit nicht nur 2 Wochen, sondern mehr als >5 Jahren< bessere Alternativen gibt.

Ja, ich verstehe auch Firmen, die ewig lang an alter Software hängen, weil die Entwickler nicht bereit sind, sich selbst weiter zu bilden und damit unnötig lang bereits abgekündigte /veraltete Technologie in neuer Software verwenden.
Die Firmen haben aber daraus gelernt und suchen vermehrt Entwickler, die bereit sind, vorne mitspielen zu wollen - sonst wird die Firma auch nicht vorne mitspielen.

Deine Frage hab zumindest ich bereits beantwortet.

6.911 Beiträge seit 2009
vor 7 Jahren

Hallo emuuu,

den Login-Code in Core zu verschieben

Das ist auch passend so. Ob du dann Vererbung od. Komposition verwendest hängt von den näheren Umständen deines Projekts ab.

Z.B.


using System.ServiceModel;

namespace Core
{
	public class LoginToken
	{
		//
	}

	[ServiceContract]
	public interface ICoreService
	{
		[OperationContract]
		bool Login(LoginToken token);
	}

	public class CoreService : ICoreService
	{
		public bool Login(LoginToken token)
		{
			//
			return true;
		}
	}
}


using System.ServiceModel;
using Core;

namespace InnerService
{
	[ServiceContract]
	public interface IInnerService : ICoreService
	{
		[OperationContract]
		int GetUltimateAnswer();
	}

	public class InnerService : CoreService, IInnerService
	{
		public int GetUltimateAnswer()
		{
			return 42;
		}
	}
}

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"