2009-06-30 14 views
0

Ich erstelle eine asp.net mvc Website und ich brauche einen Rat. Ich habe folgende Schichten:Spring + Hibernate - mehrere Datenbanken

  • Datenbank
  • Datenzugriffsschicht (Domänenobjekte, DAO-Schnittstellen + DAO-Implementierungen auf Basis eines NHibernate)
  • Dienstschicht (Service-Schnittstellen + Service-Implementierungen)
  • Präsentationsschicht (ASP.NET MVC)

Es gibt tatsächlich mehrere Datenbanken:

  • eine Datenbank mit einer gemeinsamen Daten- und Kundenliste
  • viele Datenbanken - jede Datenbank für einen Kunden (mit der gleichen Struktur, aber nicht auf dem gleichen Server necessery)

DAO und Dienstleistungen sind „verbunden“ auf diese Weise:

MyMainService (contains business logic) 
    MyMainDao (contains data access functions) 
    MyMainSessionFactory (session factory for the main database) 
     MyMainDbProvider (db provider with a connection to the main database) 

oder:

MyCustomerService (contains business logic) 
    MyCustomerDao (contains data access functions) 
    MyCustomerSessionFactory (session factory for the customer database) 
     MyCustomerDbProvider (db provider with a connection to the main database) 

oder gemischt (mit beiden Datenbanken zur gleichzeitig):

MySuperService (contains business logic) 
    MyMainDao (contains data access functions) 
    MyMainSessionFactory (session factory for the main database) 
     MyMainDbProvider (db provider with a connection to the main database) 
    MyCustomerDao (contains data access functions) 
    MyCustomerSessionFactory (session factory for the customer database) 
     MyCustomerDbProvider (db provider with a connection to the main database) 

Ich verwende Eigenschaft Platzhalter (und die PropertyPlaceholderConfigurer) in beiden Anbieter.

Und hier kamen wir zu dem Punkt, wo ich diese Dienste verwenden möchte (in einem ASP.NET MVC-Controller):

Es gibt kein Problem, wenn ich MyMainService verwenden will - ich verwende DI und alles funktioniert .

Aber wenn ich MyCustomerService oder MySuperService verwenden möchte, glaube ich nicht, dass ich DI, aber mehr "Abhängigkeit ziehen" kann. Ich denke, dass ich eine Art "Service-Fabrik" erstellen sollte, an die ich eine Kunden-ID weitergeben werde und die Service Factory wird mir den Service mit der Verbindung zur entsprechenden Datenbank zurückgeben. Etwas wie:

TService GetService<TService>(int customerId) 
{ 
    CustomerInfo info = GetCustomerInfo(customerId); 
    IConfigurableApplicationContext context = (IConfigurableApplicationContext)WebApplicationContext.GetRootContext(); 
    PropertyPlaceholderConfigurer conf = (PropertyPlaceholderConfigurer)context.GetObject("PropertyPlaceholderConfigurer"); 
    conf.Properties["db.datasource"] = info.DataSource; 
    conf.Properties["db.user"] = info.UserName; 
    conf.Properties["db.password"] = info.Password; 
    conf.Properties["db.database"] = info.DatabaseName; 
    context.AddObjectFactoryPostProcessor(conf); 
    context.Refresh(); 
    IEnumerator it = context.GetObjectsOfType(typeof(TService)).Values.GetEnumerator(); 
    if (it.MoveNext()) 
    { 
    return (TService)it.Current; 
    } 
} 

Ist dies der richtige Weg, oder bin ich völlig falsch und ich sollte dies eine andere Art und Weise tun?

Hinweis: Es wird ein Fall sein, wenn ich den gleichen Service für verschiedene Kunden in der gleichen Zeit, zum Beispiel nutzen will:

IMyService s1 = GetService<IMyService>(1); 
    IMyService s2 = GetService<IMyService>(2); 
    s1.importData(s2.exportData()); 

Jede Beratung geschätzt würde.

Vielen Dank!

Antwort

0

Im "MySuperService" verwenden Sie beide Beans (MyMainDao und MyCustomerDao). Dies funktioniert, da sie unterschiedliche Typen haben (Java-Klassen).

Wenn Sie eine Fabrik haben möchten, die beide zurückgeben können, verwenden Sie den gleichen Ansatz wie in "MySuperService", aber anstatt sich auf den Typ zu verlassen, geben Sie den beiden Beans unterschiedliche Namen.So kann Ihre Fabrik sie nach Namen suchen und Sie können sagen:

connector = factory.lookup("name"); 
+0

Ich bin mir nicht sicher, was du meinst. Kannst du es bitte ein bisschen mehr beschreiben? Vielen Dank! – rrejc

+0

Siehe meine Änderungen (äh ... komplett umgeschrieben :) –