NHibernate - IUserType для изменения типа? - PullRequest
0 голосов
/ 25 февраля 2012

Мое приложение имеет следующие классы:

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; }
}

Теперь, если бы я хотел обновить параметры для определенного виджета, я бы сказал что-то вроде:

// 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);

У меня естьсделать обратное, когда я хочу получить параметры.Вы можете себе представить, что это становится довольно утомительным.Мне было интересно, возможно ли это было сделать автоматически?

Я смотрел на интерфейс IUserType.Я нашел статью , которая вроде как.Однако моя проблема немного сложнее, так как мой тип меняется в зависимости от типа виджета.

Буду признателен, если кто-нибудь сообщит мне, возможно ли это и, возможно, каким образом это может быть достигнуто.Спасибо

1 Ответ

1 голос
/ 27 февраля 2012

легкий путь

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; }
    }
}

оно не может быть в свойстве Parameters, потому что тогда вам нужно get -> alter -> set вместо get -> alter. Но вы правы, что создание объекта параметров должно идти в метод получения параметров, потому что только там мы можем быть уверены, что WidgetType загружен

это, по сути, то же самое, что UserType, за исключением того, что мы знаем, что WidgetType существует

...