2012-02-25 4 views
0

Мое приложение имеет следующие классы:NHibernate - IUserType для изменения типа?

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. Я нашел article, который подобен. Однако моя проблема немного сложнее, так как мой тип изменяется в зависимости от типа виджета.

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

ответ

1

простой способ

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

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

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

+0

Спасибо, я вижу, что это работает, но я не уверен, что полностью его понимаю. Является ли свойство Parameters параметром, который сопоставляется с базой данных? Если это так, то не должно быть строкой, и SerializedParameters вернут объект? – nfplee

+0

'SerializedParameters' - это свойство, отображаемое на db. он содержит преобразование, для которого требуются другие свойства, поэтому его сложнее сделать в UserType, где другие свойства не могут быть инициализированы. «Параметры» не отображаются вообще – Firo

+0

Все еще не имеет большой радости. Извините за боль, но уверены, что код сериализации и десериализации входит в свойство SerializedParameters, а не в свойство Parameters? Если бы вы могли привести пример получения и настройки свойства на основе моего сценария, который будет оценен. Спасибо – nfplee

Смежные вопросы