2012-02-25 69 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加載

它本質上是相同的用戶類型,除了我們知道WidgetType有

+0

謝謝,我可以看到這個工作,但我不知道我完全理解它。 Parameters屬性是映射到數據庫的屬性嗎?如果是這樣,那麼它不應該是一個字符串,SerializedParameters會返回一個對象? – nfplee 2012-02-27 11:19:13

+0

'SerializedParameters'是映射到db的屬性。它包含需要其他屬性工作的轉換,因此在其他屬性可能未初始化的UserType中難以完成。 '參數'根本沒有映射 – Firo 2012-02-27 11:39:55

+0

仍然沒有太多的喜悅。對不起,是一個痛苦,但你確定序列化和反序列化代碼進入SerializedParameters屬性,而不是參數屬性?如果你可以提供一個基於我的情景獲取和設置屬性的例子,將不勝感激。謝謝 – nfplee 2012-02-27 15:36:34