Ich habe eine Klasse A mit einer öffentlichen Methode in C #. Ich möchte den Zugriff auf diese Methode nur für Klasse B zulassen. Ist das möglich?
AKTUALISIEREN :
Das möchte ich tun:
%Vor%Ich möchte andere Programmierer tun:
%Vor%Ich möchte sicherstellen, dass sie ProcessInactiveProduct nicht manuell aufrufen:
%Vor%Ich möchte den Zugriff von Category.ProcessInactiveProduct nur auf die Klasse Product zulassen. Andere Klassen sollten Category.ProcessInactiveProduct nicht aufrufen können.
Sie können, wenn Sie der Klasse A
eine private, verschachtelte Klasse innerhalb der Klasse B
machen:
Nur B
kann A
sehen und es sind Mitglieder in diesem Beispiel.
Alternativ könnten Sie B
in A
:
In diesem Fall kann jeder A
und B
sehen, aber nur B
kann A.Foo
sehen.
Sie können den Methoden- / Klassenzugriff auf diese Weise einschränken:
%Vor%Sehen Sie sich Ссылка für weitere Informationen an.
Verwalteter Code bietet mehrere Möglichkeiten zum Einschränken der Methode Zugriff :
...
- Beschränken Sie den Methodenzugriff auf Anrufer mit einer angegebenen Identität - im Wesentlichen jeden bestimmten Beweis (starker Name, Herausgeber, Zone usw.), den Sie auswählen.
Es gibt keine fertige Antwort auf Ihre Frage.
Wenn sie sich bereits in derselben Assembly befinden, warum nicht stattdessen die Methode internen Bereich verwenden?
Wenn sie sich in verschiedenen Assemblys befinden, können Sie den " Freund "Syntax, die alle internen Methoden abdeckt.
Wahrscheinlich ist Ihre beste Lösung, den Zugriff auf die öffentlichen Methoden auf bestimmte Assemblies zu beschränken. Das bedeutet, dass jemand nicht einfach eine neue Assembly schreiben und Ihre öffentlichen Methoden aufrufen kann. Angesichts der Tatsache, dass Sie ein Domänenmodell zu haben scheinen, sollte diese Methode möglicherweise von anderen Domänenobjekten aufgerufen werden, aber möglicherweise nicht von der Geschäftslogik. Dies kann erreicht werden, indem Domänen-DLLs einen eindeutigen starken Namen zugewiesen werden.
Sie können den Zugriff auf eine öffentliche Methode beschränken, damit sie nur von Methoden in Assemblys aufgerufen wird, die einen bestimmten öffentlichen Schlüssel erfüllen. Siehe msdn StrongNameIdentityPermission
Sie könnten einen Observer-Mustertyp verwenden, bei dem die Kategorie ein Interesse an bestimmten Ereignissen im Produkt registriert (vielleicht ein ProductInactivated-Ereignis?) und dann die Logik entsprechend behandelt. Dieses ereignisbasierte Muster ist sehr gebräuchlich und reduziert die Kopplung stark. Die Kategorie ist letztendlich für ihren eigenen Staat verantwortlich und verlässt sich nicht darauf, dass das Produkt etwas darüber weiß, was es enthält, um den Zustand der Kategorie intakt zu halten. Das Produkt informiert interessierte Kunden, wenn Dinge passiert sind.
Eine weitere Option besteht darin, Ihre Category-Klasse so zu refactorisieren, dass sie ein CategoryProductServices-Objekt enthält oder von einem CategoryProductServices-Objekt enthalten ist, das die Methoden enthält, die ein Produkt in seiner übergeordneten Kategorie ausführen müsste. Geben Sie in dem Kontext, in dem die Kategorien und Produkte erstellt werden, die Instanz dieses CategoryProductServices-Objekts an das Produkt und nicht an die vollständige Kategorie weiter. Dieser Entwurf hält die Schnittstelle öffentlich, verhindert jedoch, dass Ihr Client Zugriff auf die Dienste erhält, da sie eine Instanz nicht abrufen können. Es lockert auch die enge Kopplung von Produkten an die Kategorie-Klasse und beschränkt sie nur auf die Dienste, die den Produkten bekannt sein müssen. Dadurch bleibt das Produkt für den Staat verantwortlich, begrenzt aber zumindest, was es wissen muss.