Example #1
0
            protected override void Arrange()
            {
                AssemblyLoader.EnsureLoaded <Marker_EdFi_Ods_Test_TestExtension>();

                _registrarStub = mocks.DynamicMock <IEntityExtensionRegistrar>();

                _assembliesProviderStub = Stub <IAssembliesProvider>();

                _assembliesProviderStub.Stub(x => x.GetAssemblies())
                .Return(
                    new Assembly[]
                {
                    new FakeExtensionAssembly(typeof(Marker_EdFi_Ods_Test_TestExtension))
                });

                _container = new WindsorContainer();

                _domainModelProvider = new DomainModelProvider(
                    new IDomainModelDefinitionsProvider[]
                {
                    new EdFiDomainModelDefinitionsProvider(), new DomainModelDefinitionsProvider()
                });

                _container.Register(
                    Component.For <IDomainModelProvider>()
                    .Instance(_domainModelProvider));

                _configValueStub = Stub <IConfigValueProvider>();

                _configValueStub.Stub(x => x.GetValue(ExcludedExtensionSources))
                .Return(default(string));

                _container.Register(
                    Component.For <IConfigValueProvider>()
                    .Instance(_configValueStub));
            }
 /// <summary>
 /// Initializes a new instance of the <see cref="EntityExtensionsFactory"/> class, protected so as to implement the Singleton pattern.
 /// </summary>
 public EntityExtensionsFactory(IEntityExtensionRegistrar entityExtensionRegistrar)
 {
     _entityExtensionRegistrar = entityExtensionRegistrar;
 }
        private void RegisterExtensions(Assembly assembly, IEntityExtensionRegistrar registrar, IWindsorContainer container)
        {
            string extensionAssemblyName = assembly.GetName()
                                           .Name;

            var extensionSchemaProperCaseName = ExtensionsConventions.GetProperCaseNameFromAssemblyName(extensionAssemblyName);

            var domainModel = container.Resolve <IDomainModelProvider>()
                              .GetDomainModel();

            string schemaPhysicalName = domainModel.SchemaNameMapProvider
                                        .GetSchemaMapByProperCaseName(extensionSchemaProperCaseName)
                                        .PhysicalName;

            var extensionsByStandardEntity = domainModel
                                             .Entities
                                             .Where(e => e.Schema.Equals(schemaPhysicalName) && (e.IsEntityExtension || e.IsAggregateExtensionTopLevelEntity))
                                             .Select(
                e => new
            {
                Parent            = e.Parent, Entity = e, IsAggregateExtension = e.IsAggregateExtension,
                IsEntityExtension = e.IsEntityExtension
            })
                                             .GroupBy(x => x.Parent, x => x)
                                             .ToList();

            var aggregateExtensionEntities = extensionsByStandardEntity
                                             .SelectMany(x => x)
                                             .Where(x => x.IsAggregateExtension)
                                             .Select(x => x.Entity);

            var entityExtensions = extensionsByStandardEntity
                                   .SelectMany(x => x)
                                   .Where(x => x.IsEntityExtension)
                                   .Select(
                x => new
            {
                Entity     = x.Entity,
                IsRequired = x.Entity.ParentAssociation.Association.Cardinality == Cardinality.OneToOneExtension
            });

            // Register aggregate extensions
            foreach (var aggregateExtensionEntity in aggregateExtensionEntities)
            {
                string standardTypeName = aggregateExtensionEntity.Parent.EntityTypeFullName(EdFiConventions.ProperCaseName);
                var    standardType     = Type.GetType($"{standardTypeName}, {Namespaces.Standard.BaseNamespace}");

                registrar.RegisterAggregateExtensionEntity(standardType, aggregateExtensionEntity);
            }

            // Register explicit entity extensions
            foreach (var entityExtension in entityExtensions)
            {
                string standardTypeName = entityExtension.Entity.EdFiStandardEntity.EntityTypeFullName(EdFiConventions.ProperCaseName);
                var    standardType     = Type.GetType($"{standardTypeName}, {Namespaces.Standard.BaseNamespace}");

                string extensionTypeName = entityExtension.Entity.EntityTypeFullName(extensionSchemaProperCaseName);
                var    extensionType     = Type.GetType($"{extensionTypeName}, {extensionAssemblyName}");

                registrar.RegisterEntityExtensionType(standardType, extensionSchemaProperCaseName, extensionType, entityExtension.IsRequired);
            }

            // Register implicit entity extensions
            // Filter down to just the standard entities that have aggregate extensions, but no entity extensions (need implicit extension classes registered)
            var implicitlyExtendedEntities = extensionsByStandardEntity
                                             .Where(p => p.Any(x => x.IsAggregateExtension) && !p.Any(x => x.IsEntityExtension));

            foreach (var implicitlyExtendedEntity in implicitlyExtendedEntities)
            {
                string standardTypeName = implicitlyExtendedEntity.Key.EntityTypeFullName(EdFiConventions.ProperCaseName);
                var    standardType     = Type.GetType($"{standardTypeName}, {Namespaces.Standard.BaseNamespace}");

                string extensionClassAssemblyQualifiedName =
                    ExtensionsConventions.GetExtensionClassAssemblyQualifiedName(standardType, extensionSchemaProperCaseName);

                var extensionType = Type.GetType(extensionClassAssemblyQualifiedName);

                registrar.RegisterEntityExtensionType(standardType, extensionSchemaProperCaseName, extensionType, isRequired: true);
            }
        }
        public EdFiExtensionsInstaller(IAssembliesProvider assembliesProvider, IEntityExtensionRegistrar registrar)
        {
            _registrar = registrar;

            Assemblies = assembliesProvider.GetAssemblies();
        }