Could you use discriminator? 

-----------------------------
e-wayne <at> isit.gd
t-07525 424 882

On 23 Aug 2010, at 01:29, Geoff <[email protected]> wrote:

> 
> 
> I have a plug-in infrastructure for a project I am working on. The
> requirement is that I have a base class, that 3rd parties can
> implement. I should be able to persist these 3rd party widgets to a
> single table.
> 
> The idea is that I have a table in our database that looks like the
> following:
> 
> (I couldn't upload an image of the table because my account is too
> new. Instead here's the table's definition)
> 
> CREATE TABLE [dbo].[WIDGET](
> [WIDGET_ID] [int] IDENTITY(1,1) NOT NULL,
> [WIDGET_NAME] [nvarchar](25) NOT NULL,
> [OBJECT_TYPE] [nvarchar](200) NOT NULL,
> [OBJECT_DATA] [nvarchar](max) NOT NULL,
>    CONSTRAINT [PK_WIDGET] PRIMARY KEY CLUSTERED([WIDGET_ID] ASC)
> )
> 
> The code for this base class would be:
> 
> public abstract class Widget
> {
>  public int Id { get; private set; }
>  public string Name { get; set; }
> 
>  protected Widget() { }
>  protected Widget(int id)
>  {
>    Id = id;
>  }
> 
>  public abstract void Render(TextWriter output);
> }
> 
> The 3rd party widgets would derive from this class can be registered
> with the application.
> 
> I need to be able to have NHibernate materialize a concrete instance
> of the stored abstract widget by inspecting the OBJECT_TYPE field and
> deserializing the value in the OBJECT_DATA field.
> 
> Some pseudo code for how I would achieve this out side of NHibernate
> would look like:
> 
> public Widget DeserializeWidget(Type type, string objectData)
> {
>  //argument Type type == The type contained in the OBJECT_TYPE column
>  //argument string objectData == The serialized data from the
> OBJECT_DATA column
> 
>  DataContractJsonSerializer dcjs = new
> DataContractJsonSerializer(type);
>  Widget result = null;
> 
>  byte[] buffer = Encoding.UTF8.GetBytes(objectData);
> 
>  using (MemoryStream ms = new MemoryStream(buffer))
>  {
>    result = (Widget)dcjs.ReadObject(ms);
>  }
>  return result;
> }
> 
> How can I inject the above code (and the inverse SerializeWidget) into
> my NHibernate mappings when an HBL query returns a Widget entity?
> 
> Or is there a better way to do this with NHibernate, being that I have
> no idea of the shape of the concrete widgets that my application needs
> to persist?
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "nhusers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/nhusers?hl=en.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to