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); } }