Exemplo n.º 1
0
 /// <summary>
 /// At some point, we'll scan for the assemblies where entities are defined. So, supply these assemblies.
 /// (Just the assembly names).
 /// <para>Alternatively, you can provide these assembly names in config file as a comma-separated list:
 /// AppSettings key should be "EntityAssemblies"
 /// </para>
 /// </summary>
 public static void AddEntityAssemblies(string[] entityAssemblies)
 {
     if (entityAssemblies != null)
     {
         foreach (var item in entityAssemblies)
         {
             EntityAssemblies.Add(item);
         }
     }
 }
        public void Initialize(ContainerBuilder containerBuilder)
        {
            if (EntityAssemblies?.Length > 0)
            {
                if (DefaultRepositoryType == null)
                {
                    throw new ArgumentNullException(nameof(DefaultRepositoryType));
                }

                Type repositoryInterfaceType = typeof(IRepository <>);
                Type entityBaseType          = typeof(IEntity);

                var entityTypeList = EntityAssemblies.SelectMany(assembly =>
                                                                 assembly.DefinedTypes.Where(t =>
                                                                                             entityBaseType.IsAssignableFrom(t.AsType())
                                                                                             )
                                                                 );
                foreach (var entityTypeInfo in entityTypeList)
                {
                    Type entityType = entityTypeInfo.AsType();

                    Type entityRepositoryType          = DefaultRepositoryType.MakeGenericType(entityType);
                    Type entityRepositoryInterfaceType = repositoryInterfaceType.MakeGenericType(entityType);
                    containerBuilder.RegisterType(entityRepositoryType).As(entityRepositoryInterfaceType);
                }
            }

            if (RepositoryAssemblies?.Length > 0)
            {
                Type repositoryInterfaceType = typeof(IRepository);

                var repositoryTypeList = RepositoryAssemblies.SelectMany(assembly =>
                                                                         assembly.DefinedTypes.Where(t =>
                                                                                                     t.IsClass && repositoryInterfaceType.IsAssignableFrom(t.AsType())
                                                                                                     )
                                                                         );
                foreach (var repositoryTypeInfo in repositoryTypeList)
                {
                    Type repositoryType = repositoryTypeInfo.AsType();

                    containerBuilder.RegisterType(repositoryType).AsImplementedInterfaces();
                }
            }

            ConfigureContainerBuilder(containerBuilder);
        }