Sto costruendo un sito Web in ASP.NET (Web Forms) su un motore con regole aziendali (che fondamentalmente si trova in una DLL separata), connesso a un database mappato con Entity Framework (in un terzo progetto separato ).
Ho progettato per primo il Motore, che ha un contesto Entity Framework, e poi ho continuato a lavorare sul sito web, che presenta vari rapporti. Credo di aver commesso un terribile errore di progettazione in quanto il sito web ha il suo contesto (che all'inizio sembrava normale).
Presento questo mockup del motore e il codice di una pagina di report:
Motore (in una DLL separata):
public Engine
{
DatabaseEntities _engineContext;
public Engine()
{
// Connection string and procedure managed in DB layer
_engineContext = DatabaseEntities.Connect();
}
public ChangeSomeEntity(SomeEntity someEntity, int newValue)
{
//Suppose there's some validation too, non trivial stuff
SomeEntity.Value = newValue;
_engineContext.SaveChanges();
}
}
E segnala:
public partial class MyReport : Page
{
Engine _engine;
DatabaseEntities _webpageContext;
public MyReport()
{
_engine = new Engine();
_databaseContext = DatabaseEntities.Connect();
}
public void ChangeSomeEntityButton_Clicked(object sender, EventArgs e)
{
SomeEntity someEntity;
//Wrong way:
//Get the entity from the webpage context
someEntity = _webpageContext.SomeEntities.Single(s => s.Id == SomeEntityId);
//Send the entity from _webpageContext to the engine
_engine.ChangeSomeEntity(someEntity, SomeEntityNewValue); // <- oops, conflict of context
//Right(?) way:
//Get the entity from the engine context
someEntity = _engine.GetSomeEntity(SomeEntityId); //undefined above
//Send the entity from the engine's context to the engine
_engine.ChangeSomeEntity(someEntity, SomeEntityNewValue); // <- oops, conflict of context
}
}
Poiché la pagina web ha il suo contesto, dare al motore un'entità da un contesto diverso causerà un errore. Mi capita di sapere di non farlo, di dare le entità del motore solo dal proprio contesto. Ma questo è un progetto molto incline agli errori. Vedo l'errore dei miei modi ora. Non conosco la strada giusta.
Sto considerando:
- Creazione della connessione nel motore e trasferimento alla pagina web. Installa sempre un motore, rendi accessibile il suo contesto da una proprietà, condividendolo. Possibili problemi: altri conflitti? Lento? Problemi di concorrenza se voglio espandere ad AJAX?
- Creazione della connessione dalla pagina Web e trasmissione al motore (credo che si tratti di un'iniezione di dipendenza?)
- Solo parlando tramite ID. Crea ridondanza, non sempre pratico, suona arcaico. Ma allo stesso tempo, ho già recuperato materiale dalla pagina come ID che devo comunque recuperare.
Quale sarebbe il miglior compromesso qui per sicurezza, facilità d'uso e comprensione, stabilità e velocità?