#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously /// <inheritdoc/> public override async ValueTask <IIxInstanceLock> GetInstance( IIxInstance parentInstance, IxIdentifier identifier, IxHost.IxResolveContext context, [CanBeNull] IxResolveFrame frame) { if (parentInstance == null) { throw new ArgumentNullException(nameof(parentInstance)); } lock (Host.InstanceTreeSyncRoot) { IIxInstanceLock scopeLock; IxScopeInstance singleton; object data = parentInstance.GetData(this); if (data == null) { singleton = new IxScopeInstance(this, parentInstance, out scopeLock); parentInstance.SetData(this, singleton); } else { singleton = (IxScopeInstance)data; scopeLock = new IxInstancePinLock(singleton); } return(scopeLock); } }
/// <summary> /// Initializes a new instance of the <see cref="IxInstance"/> class. /// </summary> /// <remarks> /// Instance creates in the "Half-instantiated state". /// </remarks> /// <param name="providerNode">Node that produces instance.</param> /// <param name="parentInstance">Direct parent instance.</param> /// <param name="creatorTempLock">First temp lock for the creator of a new instance.</param> public IxInstance( IxProviderNode providerNode, [CanBeNull] IIxInstance parentInstance, out IIxInstanceLock creatorTempLock) : base(providerNode.Host.InstanceTreeSyncRoot) { ProviderNode = providerNode; _parentInstance = parentInstance; _ownedLocks = new ProcessableSet <IIxInstanceLock>(); _locks = new ProcessableSet <IIxInstanceLock>(); _childrenDisposeCompleted = new AwaitableEvent(); if (parentInstance != null) { new IxInstanceChildLock(parentInstance, this); } creatorTempLock = new IxInstancePinLock(this); _initTempLock = creatorTempLock; }