Beispiel #1
0
        public MutableType CreateAddtionalProxyType(object additionalTypeID, Type baseType)
        {
            ArgumentUtility.CheckNotNull("baseType", baseType);

            var type = _mutableTypeFactory.CreateProxy(baseType, ProxyKind.AdditionalType).Type;

            _additionalTypes.Add(additionalTypeID, type);

            return(type);
        }
Beispiel #2
0
        public TypeAssemblyResult AssembleType(AssembledTypeID typeID, IParticipantState participantState, IMutableTypeBatchCodeGenerator codeGenerator)
        {
            ArgumentUtility.CheckNotNull("typeID", typeID);
            ArgumentUtility.CheckNotNull("participantState", participantState);
            ArgumentUtility.CheckNotNull("codeGenerator", codeGenerator);

            var requestedType = typeID.RequestedType;

            CheckRequestedType(requestedType);

            if (ShortCircuitTypeAssembly(requestedType))
            {
                return(new TypeAssemblyResult(requestedType));
            }

            var typeModificationTracker = _mutableTypeFactory.CreateProxy(requestedType, ProxyKind.AssembledType);
            var context = new ProxyTypeAssemblyContext(
                _mutableTypeFactory, _participantConfigurationID, participantState, requestedType, typeModificationTracker.Type);

            foreach (var participant in _participants)
            {
                var idPart = _assembledTypeIdentifierProvider.GetPart(typeID, participant);
                participant.Participate(idPart, context);
            }

            if (!typeModificationTracker.IsModified())
            {
                return(new TypeAssemblyResult(requestedType));
            }

            var generatedTypesContext = GenerateTypes(typeID, context, codeGenerator);

            context.OnGenerationCompleted(generatedTypesContext);

            return(new TypeAssemblyResult(
                       generatedTypesContext.GetGeneratedType(context.ProxyType),
                       context.AdditionalTypes.ToDictionary(kvp => kvp.Key, kvp => generatedTypesContext.GetGeneratedType(kvp.Value))));
        }