This example demonstrates how you can use an ID-generator to identify objects across objects containers. Take a look advantages and disadvantages of ID-generators: See "Comparison Of Different IDs"
This example assumes that all object have a common super-class, IDHolder, which holds the id.
private int id;
public int Id
{
get { return id; }
set { id = value; }
}
Private m_id As Integer
Public Property Id() As Integer
Get
Return m_id
End Get
Set(ByVal value As Integer)
m_id = value
End Set
End Property
Don't forget to index the id-field. Otherwise finding objects by id will be slow.
configuration.Common.ObjectClass(typeof (IDHolder)).ObjectField("id").Indexed(true);
configuration.Common.ObjectClass(GetType(IDHolder)).ObjectField("id").Indexed(True)
The hard part is to write an efficient ID-Generator. For this example a very simple auto increment generator is used. Use the creating-callback-event in order to add the ids to the object. When committing, store the state of the id-generator.
AutoIncrement increment = new AutoIncrement(container);
IEventRegistry eventRegistry = EventRegistryFactory.ForObjectContainer(container);
eventRegistry.Creating+=
delegate(object sender, CancellableObjectEventArgs args)
{
if (args.Object is IDHolder)
{
IDHolder idHolder = (IDHolder)args.Object;
idHolder.Id = increment.GetNextID(idHolder.GetType());
}
};
eventRegistry.Committing +=
delegate(object sender, CommitEventArgs args)
{
increment.StoreState();
};
Dim increment As New AutoIncrement(container) Dim eventRegistry As IEventRegistry = EventRegistryFactory.ForObjectContainer(container) AddHandler eventRegistry.Creating, AddressOf increment.HandleCreating AddHandler eventRegistry.Committing, AddressOf increment.HandleCommiting
The id is hold by the object itself, so you can get it directly.
IDHolder idHolder = (IDHolder) obj; int id = idHolder.Id;
Dim idHolder As IDHolder = DirectCast(obj, IDHolder) Dim id As Integer = idHolder.Id
You can get the object you can by a regular query.
object instance = container.Query(delegate(IDHolder o) { return o.Id == id; })[0];
Dim instance As Object = container.Query(Function(o As IDHolder) o.Id = id)(0)