In meinem Entwicklungsteam ausgeführt wird, verwenden wir das CQRS Muster wie in this article beschrieben und mit den empfohlen DI Containern: Simple Injector (pun beabsichtigt).Einfache Injector Registrierung und intern Command
Dies ist unsere aktuelle Projektstruktur:
- 01 WebApp
references => [02] [03]
- 02 Contract
- 03 BusinessLayer
Projekt 01 ist der Client (eine ASP.NET MVC 4-Anwendung) Wo registrieren wir die Dienste unserer App mit Simple Injector (Bootstrapper
). In Projekt 03 werden alle Befehls- und Abfrage-Handler wie im Artikel beschrieben definiert. In Projekt 02 sind die Befehle und Abfragen definiert. Damit Simple Injector die Handler registrieren kann, hat der Client einen direkten Verweis auf die Business-Schicht-Assembly.
Der Behälter registriert die commandhandlers wie diese
container.Register(typeof(ICommandHandler<>), assemblies);
Das Problem ist jetzt, ist, dass einer unserer Entwickler versehentlich einen seiner Handler-Klassen vergessen wie public
zu erklären. Also statt:
public class AddCustomerCommandHandler : ICommandHandler<AddCustomerCommand> { ... }
schrieb er:
class AddCustomerCommandHandler : ICommandHandler<AddCustomerCommand> { ... }
nun nach msdn, wenn der Zugriffsmodifikator weggelassen wird, intern verwendet wird:
Klassen und Strukturen, die direkt deklariert werden Innerhalb eines Namespace (in andere Wörter, die nicht in anderen Klassen oder Strukturen verschachtelt sind) kann entweder öffentlich oder intern sein. Intern ist der Standardwert, wenn kein Zugriff Modifikator angegeben ist.
Nun internen ist definiert als:
Der Typ oder Mitglied kann von jedem Code in der gleichen Anordnung zugegriffen werden kann, aber nicht von einer anderen Baugruppe.
Nach dem Versuch, diesen Befehl auszuführen, wirft die Laufzeit keine Fehler und der Befehl wird glücklich ausgeführt. Ich bin überrascht, weil ich einen Simulationsfehler von Simple Injector erwarten würde, was nicht der Fall ist. Auch wenn ich versuche, das Handler-Objekt direkt aus dem Client zu instantiieren, gibt der Compiler mir einen Fehler, it cannot access an internal class here
, wie beabsichtigt! Warum kann Simple Injector diesen Commandhandler registrieren, während sein Zugriffsmodifikator internal
ist?