Ich arbeite derzeit an einem Erweiterungsframework, das zusätzlich zu ASP.NET MVC verwendet werden kann. Mein Erweiterbarkeits-Framework basiert auf dem berühmten Ioc-Container: Structuremap.
Der Anwendungsfall, den ich zu erfüllen versuche, ist einfach: Erstellen Sie eine Anwendung mit einigen grundlegenden Funktionen, die für jeden Kunden erweitert werden können (= Mandantenfähigkeit). Es sollte nur eine Instanz der Anwendung gehostet werden, aber diese Instanz kann für jeden Kunden angepasst werden, ohne Änderungen an der Kernwebsite vorzunehmen.
Ich wurde von dem Artikel über Multitätigkeit von Ayende Rahien inspiriert: http://ayende.com/Blog/archive/2008/08/16/Multi-Tenancy--Approaches-and-Applicability.aspx
Eine weitere Inspirationsquelle war die Buch von Eric Evans über Domain Driven Design. Mein Extensibility-Framework basiert auf dem Repository-Muster und dem Konzept der Root-Aggregate. Um das Framework verwenden zu können, sollte die Hosting-Anwendung auf Repositorys und Domänenobjekten basieren. Die Controller, Repositorys oder Domänenobjekte werden zur Laufzeit von der ExtensionFactory gebunden.
Ein Plug-In ist einfach eine Zusammenstellung, die Controller oder Repositorys oder Domänenobjekte enthält, die eine bestimmte Namenskonvention einhalten. Die Namenskonvention ist einfach. Jeder Klasse sollte die Kunden-ID vorangestellt werden, z. B.: AdventureworksHomeController.
Um eine Anwendung zu erweitern, kopieren Sie eine Plug-In-Assembly in den Erweiterungsordner der Anwendung. Wenn ein Benutzer eine Seite im Stammverzeichnis des Kunden anfordert, z. B.:
Http://multitenant-site.com/[customerID‹/[controller‹/[action],
überprüft das Framework, ob für diesen bestimmten Kunden ein Plug-In vorhanden ist, und instanziiert die benutzerdefinierten Plug-In-Klassen, andernfalls wird der Standard einmal geladen. Die benutzerdefinierten Klassen können Controller - Repositorys oder Domänenobjekte sein. Dieser Ansatz ermöglicht die Erweiterung einer Anwendung auf allen Ebenen, von der Datenbank bis zur Benutzeroberfläche, über das Domänenmodell und die Repositorys.
Wenn Sie einige vorhandene Funktionen erweitern möchten, erstellen Sie ein Plug-In für eine Assembly, die Unterklassen der Kernanwendung enthält. Wenn Sie völlig neue Funktionen erstellen müssen, fügen Sie dem Plug-In neue Controller hinzu. Diese Controller werden vom MVC-Framework geladen, wenn die entsprechende URL angefordert wird. Wenn Sie die Benutzeroberfläche erweitern möchten, können Sie eine neue Ansicht im Erweiterungsordner erstellen und auf die Ansicht eines neuen oder untergeordneten Controllers verweisen. Um das vorhandene Verhalten zu ändern, können Sie neue Repositorys oder Domänenobjekte erstellen oder vorhandene Unterklassen unterordnen. Die Framework-Verantwortung besteht darin, zu bestimmen, welcher Controller / Repository / Domänenobjekt für einen bestimmten Kunden geladen werden soll.
Ich empfehle einen Blick auf die Strukturkarte ( http://structuremap.sourceforge.net/Default.htm)) und insbesondere bei der Registrierung DSL-Funktionen http://structuremap.sourceforge.net/RegistryDSL.htm .
Dies ist der Code, den ich beim Start der Anwendung verwende, um alle Plug-in-Controller / Repositorys oder Domänenobjekte zu registrieren:
protected void ScanControllersAndRepositoriesFromPath(string path)
{
this.Scan(o =>
{
o.AssembliesFromPath(path);
o.AddAllTypesOf<SaasController>().NameBy(type => type.Name.Replace("Controller", ""));
o.AddAllTypesOf<IRepository>().NameBy(type => type.Name.Replace("Repository", ""));
o.AddAllTypesOf<IDomainFactory>().NameBy(type => type.Name.Replace("DomainFactory", ""));
});
}
Ich verwende auch eine ExtensionFactory, die von System.Web.MVC erbt. DefaultControllerFactory. Diese Factory ist dafür verantwortlich, die Erweiterungsobjekte (Controller / Registries oder Domänenobjekte) zu laden. Sie können Ihre eigenen Fabriken anschließen, indem Sie sie beim Start in der Datei Global.asax registrieren:
protected void Application_Start()
{
ControllerBuilder.Current.SetControllerFactory(
new ExtensionControllerFactory()
);
}
Dieses Framework als voll funktionsfähige Beispielsite finden Sie unter: http://code.google.com/p/multimvc /