2010-07-16 8 views
5

Ho un problema molto difficile da risolvere, ho pensato e cercato molto e sono giunto a una conclusione che menzionerò. il problema è che ho un client che vuole creare un sito web basato su una funzionalità comune, quindi chiamiamolo Moduli, quindi quello che pensavo è usare MVC Contrib. Portable Aree, che sono ottime idee per collegare i moduli, ma io ho un grosso problema, diciamo che ho creato un modulo Blog che sarà implementato in un nuovo sito che vuole, ora alcuni utenti hanno requisiti unici come uno di loro ha bisogno di aggiungere una galleria di immagini per ogni articolo, o Elenco di riferimenti in ogni articolo . questo sarebbe facile in situazione normale in cui si dispone di un sito su cui lavorare, quindi tutto quello che dovete fare èBasato su modulo complicato Creare un nuovo record in DB con ASP.NET MVC 2

  • aggiungere una nuova tabella galleria con chiave esterna per la tabella Blog.
  • rigenerare il codice Linq2SQl e aggiornare il modello.
  • aggiungi nuovi elementi del modulo a Crea, Modifica, Elimina viste.
  • aggiungere la logica nel controller.

ma nella mia situazione è complicata e il tempo ingombrante a causa di 2 motivi

  • se la nuova funzionalità è fresco ed il cliente decide di implementare in tutti i siti, allora devo ripetere la lavoro per ogni sito.
  • se la funzionalità è unica creerà incoerenza per me in futuro

è per questo che, come primo passo per risolvere il problema che ho usato Aree portatili per creare relazionati a ciascun modulo, ora questo sarà sicuramente facilitare il mio lavoro trascinando 1 DLL per ogni nuovo modulo o Addon, ma ho un piccolo problema qui, che

  • perché il nuovo modulo o componente aggiuntivo è un Dll, come posso creare un tale funzionalità nel mio pannello di amministrazione di installa il nuovo Addon o trova uno nuovo aggiunto Modulo/Addon trascinato nuove DLL per l'applicazione principale
  • ciò che è meglio pratica per creare un'installazione procedura all'interno dell'Area portatile, come aggiornamento DB, nuove rotte, ecc ..

Ora per il problema più grande che è specifico per il modulo Addon :) prendiamo indietro l'articolo Galleria Addon, se seguo la logica che ho accennato in precedenza con la creazione di una zona come portatile, sarebbe più facile creare una funzionalità nel codice del modulo per scorrere tutti i componenti aggiuntivi installati e elencarli nelle viste CRUD, ma poiché ho isolato l'addon e non voglio aggiornare manualmente il codice del modulo principale per i motivi sopra, non ci sarà alcun modo per eseguendo operazioni CRUD per i nuovi Addon in Sync con il modulo principale perché non esiste alcuna relazione di chiave esterna, anche perché come ho detto sopra potrebbe essere Opzionale, quindi ho pensato alla seguente soluzione che spero ci sarebbe una migliore

Primo processo di installazione Creerò una tabella per l'addon di Gallery, ma invece di creare una relazione di chiave esterna creerò una chiave esterna manuale che verrà popolata generando un ID univoco nel controller del modulo principale quando creo record utilizzando il seguente codice poi riporlo in Viewdata e basta passare al controller Addon quando creo il nuovo record,

private string GenerateId() 
{ 
    long i = 1; 
    foreach (byte b in Guid.NewGuid().ToByteArray()) 
    { 
    i *= ((int)b + 1); 
    } 
    return string.Format("{0:x}", i - DateTime.Now.Ticks); 
} 
ViewData["FK"] = GenerateId(); 

ma qui ci sono le mie preoccupazioni

  • è questo il modo fattibile o semplicemente stupido .
  • è questa tecnica produce generare una chiave veramente unica.

Sono estremamente dispiaciuto se la mia domanda è zoppo, ma questo è il posto migliore per chiedere e penso che molte persone vorrebbero avere un tale funzionalità e spero che qualcuno risponderà mi

+2

Non è affatto una domanda zoppa, ma * è * una domanda di design, che richiede un po 'di riflessione. Non penso che la progettazione del tuo database debba mai richiedere di creare i tuoi ID personali, comunque.Il mio istinto è che hai bisogno di una tabella contenente tutte le informazioni del tuo plugin (se è quello che stai facendo), con una colonna aggiuntiva per distinguere i plugin l'uno dall'altro. Ciò consentirebbe di utilizzare lo stesso schema Linq in SQL per tutti i plug-in. Se sono disponibili informazioni univoche per un particolare plug-in, è possibile creare uno schema Linq/SQL separato per le informazioni univoche del plug-in. –

+1

Lo schema Linq to SQL separato può convivere con il plug-in, pertanto non è necessario aggiornare lo schema Linq a SQL principale ogni volta che si aggiunge un plug-in con informazioni univoche. Questo è solo uno dei molti modi in cui il problema potrebbe potenzialmente essere risolto. –

+0

grazie ragazzi ma, puoi dirmi esattamente cosa devo includere nello schema di plugin, solo le Tabelle Plugin? un altro problema che esiste ancora è come posso collegare il record appena inserito con i Plug in, è come ho accennato o c'è modo migliore? – DevMania

risposta

2

Penso che sia un ottima domanda. un po 'di tempo fa ho iniziato a lavorare su un progetto CMS utilizzando MVC1, dove volevo supportare i plugin. L'ho fatto in modo che l'amministratore potesse rilasciare un nuovo assieme di plug-in nella cartella bin e, all'avvio successivo dell'app, eseguire la scansione di tutti gli assembly per IPlugin (o qualsiasi altra cosa) e caricarli. Ho incorporato le viste parziali nell'assemblaggio del plugin in modo che fosse tutto autonomo. ad ogni plugin è stato assegnato un identificatore univoco quando è stato inserito in una pagina e il controller del plugin sapeva come usare quell'ID per interrogare la propria tabella (repository) per i suoi dati. l'applicazione principale non sapeva nulla dello schema del plugin.

l'unica differenza è che sembra che più siti Web siano in esecuzione sullo stesso database e che sia necessario differenziare le istanze del plug-in necessario per ciascun sito Web. Presumo da qualche parte che tu abbia una chiave che indica quale sito web è, che potrebbe essere utilizzato tramite chiave esterna per selezionare solo i plug-in per quel sito Web per la pagina in cui si trova l'utente.

Non sono sicuro che questa sia una risposta, sto solo pensando ad alta voce. speriamo che possa aiutare un po 'la discussione.

MODIFICA: per caricare automaticamente i plugin, ho utilizzato la capacità di NInject di eseguire la scansione degli assembly per i moduli IM. Il mio IPlugin eredita da Ninject.Modules.INinjectModule e tutti i plugin implementano l'interfaccia IPlugin. Poi all'avvio app, ho la seguente linea:

kernel.Load("*.Plugin.dll"); 

cui kernel è un Ninject.IKernel e quella linea esegue la scansione qualsiasi assieme corrispondenza quel modello di file, così ho potuto cadere in un assembly come Weather.Plugin.dll .

+0

grazie man per pensare fuori carico, effettivamente quello che voglio fare è lo stesso come te, i siti non sono in esecuzione su un DB centrale, ciò che intendevo è che lo schema DB principale verrà ripetuto su ciascun sito, il mio problema è che voglio quei plugin che non hanno una forte relazione di chiave esterna per ottenere l'ID dell'articolo del blog principale appena inserito per esempio in modo che possa collegarli insieme quando ho una query, e non riesco a trovare via un'altra cosa, può dimmi come cerchi quei nuovi assembly, voglio dire che qualsiasi piccolo codice potrebbe aiutare :) – DevMania

+1

ha aggiornato la mia risposta con il codice di scansione. Non sono sicuro di cosa intendi per "collegarli insieme quando chiedo". potresti dirmi cosa stai cercando di fare? –

+0

keeol man, cosa intendevo quando li ho interrogati, è che se hai letto la mia domanda sopra, ho menzionato che avrò un modulo Blog di base, e forse un nuovo Addon (Plugin) che ti permetterà di aggiungere immagini all'articolo, ora il mio problema come ho menzionato è come quando inserisco un nuovo articolo, sarò in grado di ottenere il suo id e renderlo una chiave estranea nel plugin della galleria in modo tale che quando voglio mostrare l'articolo, posso unire la query alla Tabella articoli + la tabella del plugin della galleria, in pratica la mia lotta è quando colpisco save voglio un meccanismo che otterrà l'ID nuovo articolo e lo passerà ad esempio per rendere l'azione – DevMania

Problemi correlati