public void MatchesAgainstSingleTaggedScope() { const string tag = "Tag"; var msl = new MatchingScopeLifetime(tag); var container = new Container(); var lifetimeScope = (ISharingLifetimeScope)container.BeginLifetimeScope(tag); Assert.Equal(lifetimeScope, msl.FindScope(lifetimeScope)); }
public void WhenNoMatchingScopeIsPresent_TheExceptionMessageIncludesTheTag() { var container = new Container(); const string tag = "abcdefg"; var msl = new MatchingScopeLifetime(tag); var rootScope = (ISharingLifetimeScope)container.Resolve<ILifetimeScope>(); var ex = Assert.Throws<DependencyResolutionException>(() => msl.FindScope(rootScope)); Assert.True(ex.Message.Contains(tag)); }
public void WhenNoMatchingScopeIsPresent_TheExceptionMessageIncludesTheTags() { var container = new Container(); const string tag1 = "abc"; const string tag2 = "def"; var msl = new MatchingScopeLifetime(tag1, tag2); var rootScope = (ISharingLifetimeScope)container.Resolve<ILifetimeScope>(); var ex = Assert.Throws<DependencyResolutionException>(() => msl.FindScope(rootScope)); Assert.That(ex.Message.Contains(string.Format("{0}, {1}", tag1, tag2))); }
public void MatchesAgainstMultipleTaggedScopes() { const string tag1 = "Tag1"; const string tag2 = "Tag2"; var msl = new MatchingScopeLifetime(tag1, tag2); var container = new Container(); var tag1Scope = (ISharingLifetimeScope)container.BeginLifetimeScope(tag1); Assert.Equal(tag1Scope, msl.FindScope(tag1Scope)); var tag2Scope = (ISharingLifetimeScope)container.BeginLifetimeScope(tag2); Assert.Equal(tag2Scope, msl.FindScope(tag2Scope)); }
/// <summary> /// Creates and setup the registry for a child scope. /// </summary> /// <param name="tag">The tag applied to the <see cref="ILifetimeScope"/>.</param> /// <param name="configurationAction">Action on a <see cref="ContainerBuilder"/> /// that adds component registrations visible only in the child scope.</param> /// <returns>Registry to use for a child scope.</returns> /// <remarks>It is the responsibility of the caller to make sure that the registry is properly /// disposed of. This is generally done by adding the registry to the <see cref="Disposer"/> /// property of the child scope.</remarks> private IComponentRegistryBuilder CreateScopeRestrictedRegistry(object tag, Action <ContainerBuilder> configurationAction) { var restrictedRootScopeLifetime = new MatchingScopeLifetime(tag); var tracker = new ScopeRestrictedRegisteredServicesTracker(restrictedRootScopeLifetime); var fallbackProperties = new FallbackDictionary <string, object?>(ComponentRegistry.Properties); var registryBuilder = new ComponentRegistryBuilder(tracker, fallbackProperties); var builder = new ContainerBuilder(fallbackProperties, registryBuilder); foreach (var source in ComponentRegistry.Sources) { if (source.IsAdapterForIndividualComponents) { builder.RegisterSource(source); } } // Issue #272: Only the most nested parent registry with HasLocalComponents is registered as an external source // It provides all non-adapting registrations from itself and from it's parent registries ISharingLifetimeScope?parent = this; while (parent != null) { if (parent.ComponentRegistry.HasLocalComponents) { var externalSource = new ExternalRegistrySource(parent.ComponentRegistry); builder.RegisterSource(externalSource); break; } parent = parent.ParentLifetimeScope; } configurationAction(builder); builder.UpdateRegistry(registryBuilder); return(registryBuilder); }