Пример #1
0
        public void RemovePluginsWithChildType()
        {
            var currentlyBuilding = new Dictionary <Type, TypeIdentity>();
            var repository        = new PluginRepository();

            Func <Type, TypeIdentity> identityGenerator = TypeIdentityBuilder.IdentityFactory(repository, currentlyBuilding);
            PartDefinition            parentDefinition  = new PartDefinition
            {
                Identity = identityGenerator(typeof(MockExportingInterfaceImplementation)),
            };

            var parentFileInfo = new PluginFileInfo("a", DateTimeOffset.Now);

            repository.AddPart(parentDefinition, parentFileInfo);

            PartDefinition childDefinition = new PartDefinition
            {
                Identity = identityGenerator(typeof(MockChildExportingInterfaceImplementation)),
            };

            var childFileInfo = new PluginFileInfo("b", DateTimeOffset.Now);

            repository.AddPart(childDefinition, childFileInfo);
            Assert.IsTrue(repository.ContainsDefinitionForType(TypeIdentity.CreateDefinition(typeof(MockExportingInterfaceImplementation))));
            Assert.IsTrue(repository.ContainsDefinitionForType(TypeIdentity.CreateDefinition(typeof(MockChildExportingInterfaceImplementation))));
            Assert.IsTrue(
                repository.IsSubTypeOf(
                    TypeIdentity.CreateDefinition(typeof(object)),
                    TypeIdentity.CreateDefinition(typeof(MockChildExportingInterfaceImplementation))));

            repository.RemovePlugins(new string[] { childFileInfo.Path });
            Assert.IsTrue(repository.ContainsDefinitionForType(TypeIdentity.CreateDefinition(typeof(MockExportingInterfaceImplementation))));
            Assert.IsFalse(repository.ContainsDefinitionForType(TypeIdentity.CreateDefinition(typeof(MockChildExportingInterfaceImplementation))));
        }
Пример #2
0
        public void AddPart()
        {
            var currentlyBuilding = new Dictionary <Type, TypeIdentity>();
            var repository        = new PluginRepository();

            Func <Type, TypeIdentity> identityGenerator = TypeIdentityBuilder.IdentityFactory(repository, currentlyBuilding);
            PartDefinition            definition        = new PartDefinition
            {
                Identity = identityGenerator(typeof(ExportOnProperty)),
            };

            var fileInfo = new PluginFileInfo("a", DateTimeOffset.Now);

            repository.AddPart(definition, fileInfo);

            var parts = repository.Parts();

            Assert.AreEqual(1, parts.Count());
            Assert.AreSame(definition, parts.First());
            Assert.AreSame(definition, repository.Part(TypeIdentity.CreateDefinition(typeof(ExportOnProperty))));

            var files = repository.KnownPluginFiles();

            Assert.AreEqual(1, files.Count());
            Assert.AreSame(fileInfo, files.First());
        }
Пример #3
0
        public void RemovePlugins()
        {
            var currentlyBuilding = new Dictionary <Type, TypeIdentity>();
            var repository        = new PluginRepository();

            Func <Type, TypeIdentity> identityGenerator = TypeIdentityBuilder.IdentityFactory(repository, currentlyBuilding);
            PartDefinition            partDefinition    = new PartDefinition
            {
                Identity = identityGenerator(typeof(ExportOnProperty)),
            };

            var partFileInfo = new PluginFileInfo("a", DateTimeOffset.Now);

            repository.AddPart(partDefinition, partFileInfo);

            var groupDefinition = new GroupDefinition("b");
            var groupFileInfo   = new PluginFileInfo("c", DateTimeOffset.Now);

            repository.AddGroup(groupDefinition, groupFileInfo);

            Assert.That(
                repository.KnownPluginFiles(),
                Is.EquivalentTo(
                    new List <PluginFileInfo>
            {
                partFileInfo,
                groupFileInfo,
            }));

            repository.RemovePlugins(
                new List <string>
            {
                partFileInfo.Path
            });

            Assert.That(
                repository.KnownPluginFiles(),
                Is.EquivalentTo(
                    new List <PluginFileInfo>
            {
                groupFileInfo,
            }));
            Assert.AreEqual(0, repository.Parts().Count());
            Assert.AreEqual(1, repository.Groups().Count());
            Assert.IsFalse(repository.ContainsDefinitionForType(typeof(ExportOnProperty).AssemblyQualifiedName));
        }
Пример #4
0
        private void ScanAssembly(Assembly assembly)
        {
            try
            {
                m_Logger.Log(
                    LevelToLog.Trace,
                    string.Format(
                        CultureInfo.InvariantCulture,
                        Resources.RemoteAssemblyScanner_LogMessage_ScanningAssembly_WithName,
                        assembly.FullName));

                var file     = new FileInfo(assembly.LocalFilePath());
                var fileInfo = new PluginFileInfo(file.FullName, file.LastWriteTimeUtc);

                var createTypeIdentity = TypeIdentityBuilder.IdentityFactory(m_Repository, new Dictionary <Type, TypeIdentity>());
                var mefParts           = ExtractImportsAndExports(assembly, createTypeIdentity);
                var parts = mefParts.Select(p => ExtractActionsAndConditions(p.Item1, p.Item2, createTypeIdentity));
                foreach (var part in parts)
                {
                    m_Logger.Log(
                        LevelToLog.Trace,
                        string.Format(
                            CultureInfo.InvariantCulture,
                            Resources.RemoteAssemblyScanner_LogMessage_AddingPartToRepository_WithPartInformation,
                            part.Identity));

                    m_Repository.AddPart(part, fileInfo);
                }

                var groupExporters = assembly.GetTypes().Where(t => typeof(IExportGroupDefinitions).IsAssignableFrom(t));
                foreach (var t in groupExporters)
                {
                    try
                    {
                        m_Logger.Log(
                            LevelToLog.Trace,
                            string.Format(
                                CultureInfo.InvariantCulture,
                                Resources.RemoteAssemblyScanner_LogMessage_RegisteringGroupsViaExporter_WithExporterType,
                                t.AssemblyQualifiedName));

                        var builder = new GroupDefinitionBuilder(
                            m_Repository,
                            m_ImportEngine,
                            createTypeIdentity,
                            m_ScheduleBuilder,
                            fileInfo);

                        var exporter = Activator.CreateInstance(t) as IExportGroupDefinitions;
                        exporter.RegisterGroups(builder);
                    }
                    catch (Exception e)
                    {
                        m_Logger.Log(LevelToLog.Warn, e.ToString());
                    }
                }
            }
            catch (Exception e)
            {
                m_Logger.Log(
                    LevelToLog.Error,
                    string.Format(
                        CultureInfo.InvariantCulture,
                        Resources.Plugins_LogMessage_Scanner_TypeScanFailed_WithAssemblyAndException,
                        assembly.GetName().FullName,
                        e));
            }
        }