2 Stimmen

Muster für öffentliche und interne Schnittstellen von Geschäftsobjekten

Ich möchte ein Domänenmodell mit internen Schnittstellen entwerfen und dann eingeschränkte öffentliche Schnittstellen (für Benutzer der Baugruppe) erstellen

Während dies in CSharp möglich ist, stoße ich immer wieder auf unübersichtlichen Code im Zusammenhang mit parallelen Schnittstellen:

public interface IAccount { IList<ITran> Transactions { get; } }
internal interface IAccountInternal : IAccount { IList<ITranInternal> Transactions { get; } }
internal class Account : IAccountInternal { }

Hier wird die Implementierung von Account sehr unübersichtlich, da es viele Sammlungen gibt, die doppelte Schnittstellen usw. benötigen.

Außerdem möchte ich sicherstellen, dass die öffentlichen Schnittstellen über die internen Schnittstellen implementiert werden (im Gegensatz zum direkten Zugriff auf die konkreten Klassen)

Dies muss ein häufiges Szenario sein. Kann jemand einen sauberen Ansatz empfehlen?

1voto

Jack Punkte 4364

Mit Hilfe der generischen Schnittstellenkovarianz in Dot Net 4.0 ist es mir gelungen, die Dinge zu bereinigen (man beachte den Modifikator "out" für den Parameter T)

public interface IListReadOnly<out T> : IEnumerable<T> {
    int Count { get; }
    T this[int index] { get; }
}//class

Dies ermöglicht mir die Rückgabe von Sammlungen interner Objekte, die als öffentliche Objekte typisiert sind, weil:

public interface IPublic { }
internal interface IPrivate : IPublic { }

Das funktioniert jetzt:

private IListReadOnly<IPrivate> list = ...
public IListReadOnly<IPublic> List { get { return list; } }

0voto

Jonathan Rauch Punkte 693

Das scheint eine schlechte Idee zu sein, denn das Modell scheint sehr komplex zu sein.

Mein erster Gedanke ist, den Bedarf an internen Schnittstellen zu verringern. Wenn Sie sie für den Zweck der Unit-Tests verwenden, dann würde ich empfehlen, nur die externe (öffentliche) Schnittstelle zu testen und im Wesentlichen auf die Verwendung von internen Schnittstellen ganz zu verzichten.

Wenn Sie die Notwendigkeit des internen Domänenmodells näher erläutern können, könnte dies anderen helfen, Ihre Frage besser zu beantworten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X