示例#1
0
        public static void Initialize(IAppController controller, string connectionString)
        {
            DataContext.DefaultScheme = "alf";

            controller.Register <IDbConnection>(() => new SqlConnection(connectionString));
            controller.Register <IDataContext, DataContext>();
            controller.Register <IUnitOfWorkFactory, UnitOfWorkFactory>();
            controller.Register(typeof(IRepository <>), typeof(RepositoryBase <>));
            controller.Register <IRepositoryFactory, RepositoryFactory>();
            controller.Register <IEntityFactory, EntityFactory>();

            var abstractAssembly = Assembly.GetAssembly(typeof(IAuthAlfaCRM));
            var implAssembly     = Assembly.GetAssembly(typeof(AuthAlfaCRM));

            // Entities
            var entityTypes =
                abstractAssembly.GetTypes()
                .Where(
                    t =>
                    t.Namespace == "ERIP.Sites.AlfaCrmGateway.Infrastructure.Dal.Infrastructure.DTO.Entities")
                .ToArray();

            var entityImplTypes =
                implAssembly.GetTypes()
                .Where(
                    t =>
                    t.Namespace == "ERIP.Sites.AlfaCrmGateway.Infrastructure.Dal.Dapper.DTO.Entities")
                .ToArray();

            foreach (var entityImpl in entityImplTypes)
            {
                var inerfaceName   = string.Concat("I", entityImpl.Name);
                var entityAbstract = entityTypes.Single(t => t.Name == inerfaceName);
                controller.Register(entityAbstract, entityImpl);

                // т.к. интерфейсы не имеют собственного конструктора, то делаем их мэппинг на их реализации и заимствуем
                // конструтор оттуда
                SqlMapper.SetTypeMap(entityAbstract,
                                     new CustomTypeMap(SqlMapper.GetTypeMap(entityImpl), SqlMapper.GetTypeMap(entityAbstract)));
            }

            // repositories
            var repositoryTypes =
                abstractAssembly.GetTypes()
                .Where(
                    t =>
                    t.Namespace == "ERIP.Sites.AlfaCrmGateway.Infrastructure.Dal.Infrastructure.Repositories" &&
                    t.Name.EndsWith("Repository"))
                .ToArray();

            var repositoryImplTypes =
                implAssembly.GetTypes()
                .Where(
                    t =>
                    t.Namespace == "ERIP.Sites.AlfaCrmGateway.Infrastructure.Dal.Dapper.Repositories" &&
                    t.Name.EndsWith("Repository"))
                .ToArray();

            foreach (var repositoryImpl in repositoryImplTypes)
            {
                var inerfaceName       = string.Concat("I", repositoryImpl.Name);
                var repositoryAbstract = repositoryTypes.Single(t => t.Name == inerfaceName);
                controller.Register(repositoryAbstract, repositoryImpl);
            }
        }