Nhibernate - iusertype per cambiare tipo?
-
12-11-2019 - |
Domanda
La mia applicazione ha le seguenti classi:
public class Widget {
public virtual int Id { get; set; }
public virtual WidgetType Type { get; set; }
public virtual string Parameters { get; set; }
}
public class WidgetType {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string ParametersAssembly { get; set; }
public virtual string ParametersClass { get; set; }
}
Ora, se vorrei aggiornare i parametri per un determinato widget direi qualcosa di simile:
// Get the widget
var widget = GetWidget(1);
// Create an instance of the type parameters class
var parameters = Activator.CreateInstance(Assembly.LoadFrom(Server.MapPath("~/bin/"
+ widget.Type.ParametersAssembly + ".dll")).GetType(widget.Type.ParametersClass));
... Code here to update the parameters
widget.Parameters = new XmlSerializer(parameters.GetType()).Serialize(parameters);
Devo fare il contrario quando desidero ottenere i parametri. Puoi immaginare che questo diventi piuttosto noioso. Mi chiedevo se fosse forse fare automaticamente questo?
Ho guardato l'interfaccia IUSERTYPE. Ho trovato un articolo che è un po 'simile. Tuttavia, il mio problema è un po 'più complicato poiché il mio tipo cambia in base al tipo di widget.
Lo apprezzerei se qualcuno potesse farmi sapere se questo è possibile e forse come potrebbe essere raggiunto. Grazie
Soluzione
un modo semplice
public class Widget
{
public virtual int Id { get; set; }
public virtual WidgetType Type { get; set; }
private string _serializedParameters;
private virtual string SerializedParameters {
get
{
return new XmlSerializer(Parameters.GetType()).Serialize(Parameters);
}
set
{
_serializedParameters = value;
// code to deserialize the Parameters and set to Parameters
var ptype = Assembly.LoadFrom(Server.MapPath("~/bin/" + widget.Type.ParametersAssembly + ".dll")).GetType(widget.Type.ParametersClass);
Parameters = Activator.CreateInstance(ptype);
}
}
private object _parameters;
public virtual object Parameters
{
get
{
if (_parameters == null)
_parameters = Activator.CreateInstance(Assembly.LoadFrom(Server.MapPath("~/bin/" + widget.Type.ParametersAssembly + ".dll")).GetType(widget.Type.ParametersClass));
return _parameters;
}
set { _parameters = value; }
}
}
non può essere nella proprietà dei parametri perché allora devi get -> alter -> set
invece di get -> alter
. Ma hai ragione sul fatto che la costruzione dell'oggetto parametri dovrebbe andare nel getter di parametri perché solo lì possiamo essere sicuri di caricare il widgetType
È essenzialmente lo stesso di un tipo di utente, tranne per il fatto che sappiamo che è lì widgetType