static int Main(string[] args) { WriteAppName(); if (args.Length == 0) { return(SUCCESS); } var assemblyPath = args[0]; var outputPath = args[1]; Console.WriteLine("Assembly: " + assemblyPath); Console.WriteLine("OutputPath: " + outputPath); var templates = TemplateService.GetCacheTemplatesFromAssembly(assemblyPath); if (!templates?.Any() ?? false) { Console.WriteLine($"Nothig template was found."); return(ERROR); } else { Console.WriteLine($"Was found {templates.Count()} templates."); } var codeTemplate = TemplateService.GenerateCacheCode(templates.ToArray()); return(WriteCodeTemplate(codeTemplate, outputPath) ? SUCCESS : ERROR); }
public void GenerateClassCodeByTemplate() { var model = GetCacheTemplateFromProductRepository(); var classFile = TemplateService.GenerateCacheCode(model); Assert.Contains("public class IProductRepositoryDynamicCache", classFile); Assert.Contains("public CoreApp.DefensiveCache.Tests.Contracts.Product GetProduct(System.Int32 id)", classFile); }
public void CompileMultipleAssemblies() { var model = GetCacheTemplateFromProductRepository(); var classFile = TemplateService.GenerateCacheCode(model); var assembly1 = CompilerService.GenerateAssemblyFromCode(typeof(IProductRepository).Assembly, model.Name, classFile); var assembly2 = CompilerService.GenerateAssemblyFromCode(typeof(IProductRepository).Assembly, model.Name, classFile); Assert.NotEqual(assembly1.GetHashCode(), assembly2.GetHashCode()); }
public void CompileAssemblyFromTemplate() { var model = GetCacheTemplateFromProductRepository(); var classFile = TemplateService.GenerateCacheCode(model); var assembly = CompilerService.GenerateAssemblyFromCode(typeof(IProductRepository).Assembly, model.Name, classFile); var type = assembly.GetTypes().FirstOrDefault(); Assert.Contains(model.Name, assembly.GetTypes().Select(x => x.Name)); }
public static void DecorateWithCacheDynamicService(this IServiceCollection services, InterfaceCacheConfiguration cacheConfiguration) { var serviceMatched = services.FirstOrDefault(x => x.ServiceType.Name == cacheConfiguration.Name); if (serviceMatched == null) { return; } var typeService = serviceMatched.ServiceType; var cacheTemplate = typeService.GetCacheTemplateFromReflectionType(cacheConfiguration); var cacheCode = TemplateService.GenerateCacheCode(cacheTemplate); var assemblyCache = CompilerService.GenerateAssemblyFromCode(typeService.Assembly, cacheTemplate.Name, cacheCode); var typeCache = assemblyCache.GetTypes().FirstOrDefault(); services.Decorate(typeService, typeCache); }
public async Task DecorateServiceWithDynamicAssembly() { var configuration = _serviceProvider.GetService <IConfiguration>(); var cacheFormatter = _serviceProvider.GetService <ICacheSerializer>(); var model = GetCacheTemplateFromProductRepository(); var classFile = TemplateService.GenerateCacheCode(model); var assembly = CompilerService.GenerateAssemblyFromCode(typeof(IProductRepository).Assembly, model.Name, classFile); var typeGenerated = assembly.GetTypes().FirstOrDefault(); var concreteRepository = new ProductRepository(); var cacheRepository = (IProductRepository)Activator.CreateInstance(typeGenerated, concreteRepository, configuration, cacheFormatter); var product1 = cacheRepository.GetProduct(1); product1 = cacheRepository.GetProduct(1); var product2 = await cacheRepository.GetProductAsync(1); product2 = await cacheRepository.GetProductAsync(1); Assert.Equal(10, product1.Id); Assert.Equal(10, product2.Id); }