public DomainObject NewObject(ClassDefinition classDefinition, ParamList constructorParameters) { ArgumentUtility.CheckNotNull("classDefinition", classDefinition); ArgumentUtility.CheckNotNull("constructorParameters", constructorParameters); if (classDefinition.IsAbstract) { throw new InvalidOperationException( string.Format( "Cannot instantiate type '{0}' because it is abstract. For classes with automatic properties, InstantiableAttribute must be used.", classDefinition.ClassType)); } _eventSink.RaiseNewObjectCreatingEvent(classDefinition.ClassType); var objectID = _persistenceStrategy.CreateNewObjectID(classDefinition); var initializationContext = new NewObjectInitializationContext( objectID, _clientTransaction.RootTransaction, _enlistedDomainObjectManager, _dataManager); try { return(classDefinition.InstanceCreator.CreateNewObject(initializationContext, constructorParameters, _clientTransaction)); } catch (Exception ex) { if (initializationContext.RegisteredObject != null) { CleanupCreatedObject(objectID, initializationContext.RegisteredObject, ex); } throw; } }