public InstanceProduct( BindingContainerExtender bindingExtender, MethodProduct?predicateMethod, MethodProduct factoryObjectMethod, MethodProduct funcMethod, MethodProduct?disposeMethod ) { if (bindingExtender is null) { throw new ArgumentNullException(nameof(bindingExtender)); } if (factoryObjectMethod is null) { throw new ArgumentNullException(nameof(factoryObjectMethod)); } if (funcMethod is null) { throw new ArgumentNullException(nameof(funcMethod)); } BindingExtender = bindingExtender; PredicateMethod = predicateMethod; FactoryObjectMethod = factoryObjectMethod; FuncMethod = funcMethod; DisposeMethod = disposeMethod; }
private MethodProduct CreateExplicitMethod( string explicitMethodName, MethodProduct nonExplicitMethod, DpdtArgumentWrapperTypeEnum wrapperType, ITypeSymbol wrapperSymbol ) { var explicitMethodProduct = new MethodProduct( explicitMethodName, nonExplicitMethod.ReturnType, (methodName, returnType) => $@" {returnType.ToDisplayString()} IResolution<{wrapperSymbol.ToDisplayString()}>.{methodName}(IResolutionRequest resolutionRequest) {{ return {nonExplicitMethod.MethodName}(resolutionRequest); }} " ); return(explicitMethodProduct); }
public InstanceProduct Produce() { var constructorArgumentProducers = _bindingExtender.BindingContainer.ConstructorArguments.ConvertAll( bft => new ConstructorArgumentProducer( _clusterBindings, _bindingExtender, bft ) ); var constructorArgumentProducts = constructorArgumentProducers .ConvertAll(p => p.Produce()) .FindAll(s => !ReferenceEquals(s, ConstructorArgumentProduct.Empty)) ; MethodProduct?predicateMethod = null; if (_bindingExtender.BindingContainer.IsConditional) { predicateMethod = new MethodProduct( $"CheckPredicate_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _typeInfoProvider.Bool(), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}(IResolutionTarget resolutionTarget) {{ Func<IResolutionTarget, bool> predicate = {_bindingExtender.BindingContainer.WhenArgumentClause} ; var result = predicate(resolutionTarget); return result; }} "); } var singletonInstanceName = $"_singletonInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}"; var lockerName = $"_locker_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}"; var retrieveObjectMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _bindingExtender.BindingContainer.BindToType, (methodName, returnType) => $@" private volatile {_bindingExtender.BindingContainer.BindToType.ToDisplayString()} {singletonInstanceName} = null; private readonly System.Object {lockerName} = new System.Object(); [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ if({singletonInstanceName} is null) {{ lock({lockerName}) {{ if({singletonInstanceName} is null) {{ {singletonInstanceName} = new {_bindingExtender.BindingContainer.BindToType.ToDisplayString()}( {constructorArgumentProducts.Join(p => p.ResolveConstructorArgumentClause, ",")} ); }} }} }} return {singletonInstanceName}; }} "); var funcMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}{DpdtArgumentWrapperTypeEnum.Func.GetPostfix()}", _typeInfoProvider.Func(_bindingExtender.BindingContainer.BindToType), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ return () => {retrieveObjectMethod.GetMethodName(DpdtArgumentWrapperTypeEnum.None)}(resolutionTarget); }} "); var disposeMethodInvoke = new MethodProduct( $"DisposeInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _typeInfoProvider.Void(), (methodName, returnType) => $@" private {returnType.ToDisplayString()} {methodName}( ) {{ if({singletonInstanceName} is {nameof(IDisposable)} d) {{ d.{nameof(IDisposable.Dispose)}(); }} }} "); var product = new InstanceProduct( _bindingExtender, predicateMethod, retrieveObjectMethod, funcMethod, disposeMethodInvoke ); return(product); }
public ResolutionProduct( InterfaceProduct interfaceProduct, InterfaceProduct interfaceFastProduct, MethodProduct retrieveMethod, MethodProduct retrieveExplicitMethod, CreateTupleProduct nonGenericGetTuple, MethodProduct retrieveAllMethod, MethodProduct retrieveAllExplicitMethod, CreateTupleProduct nonGenericGetAllTuple, MethodProduct retrieveFastMethod ) { if (interfaceProduct is null) { throw new ArgumentNullException(nameof(interfaceProduct)); } if (interfaceFastProduct is null) { throw new ArgumentNullException(nameof(interfaceFastProduct)); } if (retrieveMethod is null) { throw new ArgumentNullException(nameof(retrieveMethod)); } if (retrieveExplicitMethod is null) { throw new ArgumentNullException(nameof(retrieveExplicitMethod)); } if (nonGenericGetTuple is null) { throw new ArgumentNullException(nameof(nonGenericGetTuple)); } if (retrieveAllMethod is null) { throw new ArgumentNullException(nameof(retrieveAllMethod)); } if (nonGenericGetAllTuple is null) { throw new ArgumentNullException(nameof(nonGenericGetAllTuple)); } if (retrieveFastMethod is null) { throw new ArgumentNullException(nameof(retrieveFastMethod)); } InterfaceProduct = interfaceProduct; InterfaceFastProduct = interfaceFastProduct; RetrieveMethod = retrieveMethod; RetrieveExplicitMethod = retrieveExplicitMethod; NonGenericGetTuple = nonGenericGetTuple; RetrieveAllMethod = retrieveAllMethod; RetrieveAllExplicitMethod = retrieveAllExplicitMethod; NonGenericGetAllTuple = nonGenericGetAllTuple; RetrieveFastMethod = retrieveFastMethod; }
public InstanceProduct Produce() { var constructorArgumentProducers = _bindingExtender.BindingContainer.ConstructorArguments.ConvertAll( bft => new ConstructorArgumentProducer( _clusterBindings, _bindingExtender, bft ) ); var constructorArgumentProducts = constructorArgumentProducers .ConvertAll(p => p.Produce()) .FindAll(s => !ReferenceEquals(s, ConstructorArgumentProduct.Empty)) ; MethodProduct?predicateMethod = null; if (_bindingExtender.BindingContainer.IsConditional) { predicateMethod = new MethodProduct( $"CheckPredicate_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _typeInfoProvider.Bool(), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}(IResolutionTarget resolutionTarget) {{ Func<IResolutionTarget, bool> predicate = {_bindingExtender.BindingContainer.WhenArgumentClause} ; var result = predicate(resolutionTarget); return result; }} "); } var constantInstanceName = $"_constantInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}"; var retrieveObjectMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _bindingExtender.BindingContainer.BindToType, (methodName, returnType) => $@" private readonly {_bindingExtender.BindingContainer.BindToType.ToDisplayString()} {constantInstanceName} = {_bindingExtender.BindingContainer.ConstantSyntax!.GetText()}; [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ return {constantInstanceName}; }} "); var funcMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}{DpdtArgumentWrapperTypeEnum.Func.GetPostfix()}", _typeInfoProvider.Func(_bindingExtender.BindingContainer.BindToType), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ return () => {retrieveObjectMethod.GetMethodName(DpdtArgumentWrapperTypeEnum.None)}(resolutionTarget); }} "); var product = new InstanceProduct( _bindingExtender, predicateMethod, retrieveObjectMethod, funcMethod, null ); return(product); }
public InstanceProduct Produce() { var constructorArgumentProducers = _bindingExtender.BindingContainer.ConstructorArguments.ConvertAll( bft => new ConstructorArgumentProducer( _clusterBindings, _bindingExtender, bft ) ); var constructorArgumentProducts = constructorArgumentProducers .ConvertAll(p => p.Produce()) .FindAll(s => !ReferenceEquals(s, ConstructorArgumentProduct.Empty)) ; MethodProduct?predicateMethod = null; if (_bindingExtender.BindingContainer.IsConditional) { predicateMethod = new MethodProduct( $"CheckPredicate_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _typeInfoProvider.Bool(), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}(IResolutionTarget resolutionTarget) {{ Func<IResolutionTarget, bool> predicate = {_bindingExtender.BindingContainer.WhenArgumentClause} ; var result = predicate(resolutionTarget); return result; }} "); } var scopeGuidName = $"_customScopeUniqueId_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}"; var retrieveObjectMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _bindingExtender.BindingContainer.BindToType, (methodName, returnType) => $@" private readonly System.Guid {scopeGuidName} = new System.Guid(""{Guid.NewGuid()}""); [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ if(resolutionTarget.ScopeObject is null) {{ RaiseNoCustomScopeObject<{_bindingExtender.BindingContainer.BindToType.ToDisplayString()}>(); }} var result = ({_bindingExtender.BindingContainer.BindToType.ToDisplayString()}) resolutionTarget.ScopeObject.GetOrAdd( {scopeGuidName}, () => new {_bindingExtender.BindingContainer.BindToType.ToDisplayString()}( {constructorArgumentProducts.Join(p => p.ResolveConstructorArgumentClause, ",")} ) ); return result; }} "); var funcMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}{DpdtArgumentWrapperTypeEnum.Func.GetPostfix()}", _typeInfoProvider.Func(_bindingExtender.BindingContainer.BindToType), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ return () => {retrieveObjectMethod.GetMethodName(DpdtArgumentWrapperTypeEnum.None)}(resolutionTarget); }} "); var product = new InstanceProduct( _bindingExtender, predicateMethod, retrieveObjectMethod, funcMethod, null ); return(product); }
private ResolutionProduct CreateResolutionProduct( IReadOnlyList <InstanceProduct> filteredInstanceProducts, DpdtArgumentWrapperTypeEnum wrapperType, ITypeSymbol wrapperSymbol ) { var interfaceProduct = new InterfaceProduct( $"{nameof(IResolution<object>)}<{wrapperSymbol.ToDisplayString()}>" ); var interfaceFastProduct = new InterfaceProduct( $"{nameof(IResolutionFast<object>)}<{wrapperSymbol.ToDisplayString()}>" ); #region get var getMethodProduct = CreateGetMethod( filteredInstanceProducts, wrapperType, wrapperSymbol ); var getExplicitMethodProduct = CreateExplicitMethod( "Get", getMethodProduct, wrapperType, wrapperSymbol ); var nonGenericGetProduct = new CreateTupleProduct( ( _typeInfoProvider.SystemType(), $"typeof({wrapperSymbol.ToDisplayString()})" ), ( _typeInfoProvider.Func( _typeInfoProvider.GetTypeByMetadataName(typeof(IResolutionRequest).FullName !) !, _typeInfoProvider.Object() ! ), getMethodProduct.MethodName ) ); #endregion #region get all var getAllMethodProduct = CreateGetAllMethod( filteredInstanceProducts, wrapperType, wrapperSymbol ); var getAllExplicitMethodProduct = CreateExplicitMethod( "GetAll", getAllMethodProduct, wrapperType, wrapperSymbol ); var nonGenericGetAllProduct = new CreateTupleProduct( ( _typeInfoProvider.SystemType(), $"typeof({wrapperSymbol.ToDisplayString()})" ), ( _typeInfoProvider.Func( _typeInfoProvider.GetTypeByMetadataName(typeof(IResolutionRequest).FullName !) !, _typeInfoProvider.Object() ! ), getAllMethodProduct.MethodName ) ); #endregion #region get fast var getFastMethodProduct = new MethodProduct( nameof(IResolutionFast <object> .GetFast), wrapperSymbol, (methodName, returnType) => { return($@" [MethodImpl(MethodImplOptions.AggressiveInlining)] public {returnType.ToDisplayString()} {methodName}({returnType.ToDisplayString()} unused) {{ return {getMethodProduct.MethodName}( null ); }} "); } ); #endregion var resolutionProduct = new ResolutionProduct( interfaceProduct, interfaceFastProduct, getMethodProduct, getExplicitMethodProduct, nonGenericGetProduct, getAllMethodProduct, getAllExplicitMethodProduct, nonGenericGetAllProduct, getFastMethodProduct ); return(resolutionProduct); }