예제 #1
0
        public void GetOrCreate_ValidActivatorAfterInitialization_Success()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                CompositionOperation operation = null;
                var value = new object();
                object GetOrCreateActivate(LifetimeContext getOrCreateContext, CompositionOperation getOrCreateOperator)
                {
                    Assert.Same(context, getOrCreateContext);
                    Assert.Same(operation, getOrCreateOperator);

                    return value;
                }
                object Activator(LifetimeContext activatorContext, CompositionOperation activatorOperation)
                {
                    operation = activatorOperation;
                    Assert.Same(value, context.GetOrCreate(1, operation, GetOrCreateActivate));
                    return "Hi";
                }

                Assert.Equal("Hi", CompositionOperation.Run(context, Activator));
                Assert.Same(value, context.GetOrCreate(1, operation, GetOrCreateActivate));
            }
        }
예제 #2
0
 public void GetExport_OpenGenericExportFactoryWithMetadata_ThrowsIndexOutOfRangeException()
 {
     using (CompositionHost host = CompositionHost.CreateCompositionHost())
     {
         Assert.Throws <IndexOutOfRangeException>(() => host.TryGetExport(typeof(ExportFactory <,>), out object export));
     }
 }
        public void Run_ValidContextAndAction_ReturnsExpected()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType <LifetimeContext>(export);

                var results = new List <string>();
                void NonPrequisiteAction1() => results.Add("NonPrequisiteAction1");
                void NonPrequisiteAction2() => results.Add("NonPrequisiteAction2");

                void PostCompositionAction1() => results.Add("PostCompositionAction1");
                void PostCompositionAction2() => results.Add("PostCompositionAction2");

                object Activator(LifetimeContext activatorContext, CompositionOperation activatorOperation)
                {
                    Assert.Same(context, activatorContext);

                    activatorOperation.AddNonPrerequisiteAction(NonPrequisiteAction1);
                    activatorOperation.AddNonPrerequisiteAction(NonPrequisiteAction2);

                    activatorOperation.AddPostCompositionAction(PostCompositionAction1);
                    activatorOperation.AddPostCompositionAction(PostCompositionAction2);

                    return("Hi");
                }

                Assert.Equal("Hi", CompositionOperation.Run(context, Activator));
                Assert.Equal(new string[] { "NonPrequisiteAction1", "NonPrequisiteAction2", "PostCompositionAction1", "PostCompositionAction2" }, results);
            }
        }
예제 #4
0
 public void GetExport_FailedDependency_ThrowsCompositionFailedException()
 {
     using (CompositionHost host = CompositionHost.CreateCompositionHost(new FailedDependency()))
     {
         Assert.Throws <CompositionFailedException>(() => host.TryGetExport(new CompositionContract(typeof(int)), out object export));
     }
 }
예제 #5
0
 public void TryGetExport_NullContract_ThrowsArgumentNullException()
 {
     using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
     {
         AssertExtensions.Throws <ArgumentNullException>("key", () => host.TryGetExport((CompositionContract)null, out object export));
     }
 }
예제 #6
0
 public void GetExport_MultipleReturns_ThrowsCompositionFailedException()
 {
     using (CompositionHost host = CompositionHost.CreateCompositionHost(new MultiplePromises()))
     {
         Assert.Throws <CompositionFailedException>(() => host.TryGetExport(new CompositionContract(typeof(int)), out object export));
     }
 }
예제 #7
0
 public void GetExport_NullProviderInProviders_ThrowsNullReferenceException()
 {
     using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[] { null }))
     {
         Assert.Throws <NullReferenceException>(() => host.GetExport <int>());
     }
 }
예제 #8
0
 public void GetExport_AbstractMetadata_ThrowsInvalidOperationException()
 {
     using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
     {
         Assert.Throws <InvalidOperationException>(() => host.TryGetExport(typeof(Lazy <int, AbstractConstructor>), out object _));
     }
 }
예제 #9
0
 public void GetExport_InvalidMetadata_ThrowsComposititionFailedException(Type type)
 {
     using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
     {
         Assert.Throws <CompositionFailedException>(() => host.TryGetExport(type, out object _));
     }
 }
예제 #10
0
        public void Dispose_MultipleTimes_Success()
        {
            CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]);

            host.Dispose();
            host.Dispose();
        }
예제 #11
0
 public void GetExport_CompositionContextContract_ReturnsExpected()
 {
     using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
     {
         Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
         Assert.IsType <LifetimeContext>(export);
     }
 }
예제 #12
0
 public void GetExport_MultipleDependencies_ReturnsExpected()
 {
     using (CompositionHost host = CompositionHost.CreateCompositionHost(new MultipleDependency()))
     {
         Assert.True(host.TryGetExport(new CompositionContract(typeof(int)), out object export));
         Assert.Equal("hi", export);
     }
 }
예제 #13
0
        public void AddBoundInstance_NullInstance_ThrowsNullReferenceExceptionOnDisposal()
        {
            CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]);
            Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
            LifetimeContext context = Assert.IsType<LifetimeContext>(export);

            context.AddBoundInstance(null);
            Assert.Throws<NullReferenceException>(() => context.Dispose());
        }
예제 #14
0
파일: Program.cs 프로젝트: zhy29563/MyMEF
        static void Main(string[] args)
        {
            using (var cc = CompositionHost.CreateCompositionHost(new BuildTimeCodeGeneration_ExportDescriptorProvider()))
            {
                var rh = cc.GetExport <RequestListener>();
                rh.HandleRequest();
            }

            Console.ReadKey(true);
        }
예제 #15
0
        public void FindContextWithin_UnknownSharingBoundary_ThrowsCompositionFailedException()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                Assert.Throws<CompositionFailedException>(() => context.FindContextWithin("sharingBoundary"));
            }
        }
        public void Run_NullActivator_ThrowsArgumentNullException()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType <LifetimeContext>(export);

                AssertExtensions.Throws <ArgumentNullException>("compositionRootActivator", () => CompositionOperation.Run(context, null));
            }
        }
예제 #17
0
        public void FindContextWithin_NullSharingBoundary_ReturnsRoot()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                Assert.Same(context, context.FindContextWithin(null));
            }
        }
예제 #18
0
        public void GetExport_LazyOrExportFactoryContractType_ReturnsExpected(Type type, Type[] expectedContractTypes)
        {
            var tracker = new TrackingProvider();

            using (CompositionHost host = CompositionHost.CreateCompositionHost(tracker))
            {
                Assert.False(host.TryGetExport(type, out object export));
                Assert.Equal(expectedContractTypes, tracker.Contracts.Select(c => c.ContractType));
            }
        }
예제 #19
0
        public void ToString_NoParent_ReturnsExpected()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                Assert.Equal("Root Lifetime Context", context.ToString());
            }
        }
예제 #20
0
        public void GetOrCreate_NullOperation_ThrowsNullReferenceException()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                Assert.Throws<NullReferenceException>(() => context.GetOrCreate(1, null, Activator));
            }
        }
예제 #21
0
        public void AddBoundInstance_Disposed_ThrowsObjectDisposedException()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);
                context.Dispose();

                Assert.Throws<ObjectDisposedException>(() => context.AddBoundInstance(null));
            }
        }
예제 #22
0
        public void GetExport_ExportFactoryContractWithMetadataConstraints_ReturnsExpected(Type contractType, string[] sharingBoundaryNames, Type[] expectedTypes)
        {
            var tracker = new TrackingProvider();

            using (CompositionHost host = CompositionHost.CreateCompositionHost(tracker))
            {
                var contract = new CompositionContract(contractType, "contractName", new Dictionary <string, object> {
                    { "SharingBoundaryNames", sharingBoundaryNames }
                });

                Assert.False(host.TryGetExport(contract, out object export));
                Assert.Equal(expectedTypes, tracker.Contracts.Select(c => c.ContractType));
            }
        }
예제 #23
0
        public void GetExport_ImoportManyWithMetadataConstraints_ReturnsExpected(Type contractType, Type[] expectedTypes)
        {
            var tracker = new TrackingProvider();

            using (CompositionHost host = CompositionHost.CreateCompositionHost(tracker))
            {
                var contract = new CompositionContract(contractType, "contractName", new Dictionary <string, object> {
                    { "IsImportMany", true }
                });

                Assert.True(host.TryGetExport(contract, out object export));
                Assert.Empty(Assert.IsAssignableFrom <Array>(export));
                Assert.Equal(expectedTypes, tracker.Contracts.Select(c => c.ContractType));
            }
        }
예제 #24
0
        public void GetOrCreate_NullActivator_ThrowsNullReferenceException()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                object Activator(LifetimeContext activatorContext, CompositionOperation activatorOperation)
                {
                    Assert.Throws<NullReferenceException>(() => activatorContext.GetOrCreate(1, activatorOperation, null));
                    return "Hi";
                }

                Assert.Equal("Hi", CompositionOperation.Run(context, Activator));
            }
        }
        public void AddPostCompositionAction_NullAction_ThrowsArgumentNullException()
        {
            object Activator(LifetimeContext context, CompositionOperation operation)
            {
                AssertExtensions.Throws <ArgumentNullException>("action", () => operation.AddPostCompositionAction(null));
                return(null);
            }

            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType <LifetimeContext>(export);

                CompositionOperation.Run(context, Activator);
            }
        }
예제 #26
0
        public void AddBoundInstance_NonNullInstance_DisposesInstanceOnDisposal()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                var instance = new DisposableInstance();
                context.AddBoundInstance(instance);
                Assert.Equal(0, instance.CalledDisposed);

                context.Dispose();
                Assert.Equal(1, instance.CalledDisposed);

                context.Dispose();
                Assert.Equal(1, instance.CalledDisposed);
            }
        }
예제 #27
0
 public void CreateCompositionHost_NullProvider_ThrowsArgumentNullException()
 {
     AssertExtensions.Throws <ArgumentNullException>("providers", () => CompositionHost.CreateCompositionHost(null));
     AssertExtensions.Throws <ArgumentNullException>("providers", () => CompositionHost.CreateCompositionHost((IEnumerable <ExportDescriptorProvider>)null));
 }