예제 #1
0
        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;
            }
        }