public CodeNamespace Build(IList <DomainClass> domainClasses, IList <SynchronousDomainHook> domainHooks) { var codeTypeDeclaration = _classBuilderUtil.Build("GeneratedDependencies"); codeTypeDeclaration.Attributes = MemberAttributes.Final | MemberAttributes.Public; _nameSpaceBuilderUtil.WithName("Host") .WithApplication() .WithDependencyInjection() .WithSqlAdapter(); var codeMemberMethod = new CodeMemberMethod(); codeMemberMethod.Attributes = MemberAttributes.Static | MemberAttributes.Public | MemberAttributes.Final; codeMemberMethod.Name = "ConfigureGeneratedServices"; codeTypeDeclaration.Members.Add(codeMemberMethod); codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression("IServiceCollection", "collection")); codeMemberMethod.Statements.Add(new CodeSnippetExpression("collection.AddTransient<IEventStore, EventStore>()")); codeMemberMethod.Statements.Add(new CodeSnippetExpression("collection.AddTransient<IEventStoreRepository, EventStoreRepository>()")); codeMemberMethod.Statements.Add(new CodeSnippetExpression($"collection.AddTransient<{new QueueRepositoryInterface().Name}, {new QueueRepositoryClass().Name}>()")); codeMemberMethod.Statements.Add(new CodeSnippetExpression("collection.AddTransient<EventJobRegistration>()")); codeMemberMethod.Statements.Add(new CodeSnippetExpression($"collection.AddTransient<{new HangfireQueueInterface().Name}, HangfireQueue>()")); codeMemberMethod.Statements.Add(new CodeSnippetExpression($"collection.AddMvc().AddApplicationPart(typeof({domainClasses[0].Name}Controller).Assembly)")); foreach (var domainClass in domainClasses) { _nameSpaceBuilderUtil .WithApplicationEntityNameSpace(domainClass.Name) .WithHttpAdapterEntityNameSpace(domainClass.Name) .WithSqlEntityNameSpace(domainClass.Name); codeMemberMethod.Statements.Add(new CodeSnippetExpression( $"collection.AddTransient<I{domainClass.Name}Repository, {domainClass.Name}Repository>()")); codeMemberMethod.Statements.Add(new CodeSnippetExpression( $"collection.AddTransient<{domainClass.Name}CommandHandler>()")); foreach (var hook in domainClass.ChildHookMethods) { var onChildHookMethodName = _nameBuilderUtil.OnChildHookMethodName(hook); codeMemberMethod.Statements.Add(new CodeSnippetExpression($"collection.AddTransient<{new DomainHookBaseClass().Name}, {onChildHookMethodName}Hook>()")); } } foreach (var hook in domainHooks) { _nameSpaceBuilderUtil.WithHookEntityNameSpace(hook.ClassType); codeMemberMethod.Statements.Add(new CodeSnippetExpression($"collection.AddTransient<{new DomainHookBaseClass().Name}, {hook.Name}Hook>()")); } var codeNamespace = _nameSpaceBuilderUtil.Build(); codeNamespace.Types.Add(codeTypeDeclaration); return(codeNamespace); }
public CodeNamespace Write(IList <DomainClass> domainClasses, IList <AsyncDomainHook> domainHooks) { var codeTypeDeclaration = _classBuilderUtil.Build("GeneratedDependencies"); codeTypeDeclaration.Attributes = MemberAttributes.Final | MemberAttributes.Public; _nameSpaceBuilderUtil.WithName("AsyncHost") .WithApplication() .WithDependencyInjection() .WithHangfire() .WithApplicatioBuilder() .WithSqlAdapter(); var codeMemberMethod = new CodeMemberMethod(); codeMemberMethod.Attributes = MemberAttributes.Static | MemberAttributes.Public | MemberAttributes.Final; codeMemberMethod.Name = "ConfigureGeneratedServices"; codeTypeDeclaration.Members.Add(codeMemberMethod); codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression("IServiceCollection", "collection")); codeMemberMethod.Statements.Add(new CodeSnippetExpression("collection.AddTransient<IEventStore, EventStore>()")); codeMemberMethod.Statements.Add(new CodeSnippetExpression("collection.AddTransient<IEventStoreRepository, EventStoreRepository>()")); codeMemberMethod.Statements.Add(new CodeSnippetExpression($"collection.AddTransient<{new QueueRepositoryInterface().Name}, {new QueueRepositoryClass().Name}>()")); codeMemberMethod.Statements.Add(new CodeSnippetExpression("collection.AddTransient<EventJobRegistration>()")); codeMemberMethod.Statements.Add(new CodeSnippetExpression($"collection.AddTransient<{new HangfireQueueInterface().Name}, HangfireQueue>()")); foreach (var domainClass in domainClasses) { _nameSpaceBuilderUtil .WithApplicationEntityNameSpace(domainClass.Name) .WithSqlEntityNameSpace(domainClass.Name); codeMemberMethod.Statements.Add(new CodeSnippetExpression( $"collection.AddTransient<I{domainClass.Name}Repository, {domainClass.Name}Repository>()")); } foreach (var hook in domainHooks) { _nameSpaceBuilderUtil.WithAsyncHookEntityNameSpace(hook.ClassType); codeMemberMethod.Statements.Add(new CodeSnippetExpression($"collection.AddTransient<{_nameBuilderUtil.AsyncEventHookHandlerName(hook)}>()")); codeMemberMethod.Statements.Add(new CodeSnippetExpression($"collection.AddTransient<{_nameBuilderUtil.AsyncEventHookName(hook)}>()")); } var codeNamespace = _nameSpaceBuilderUtil.Build(); var codeMemberMethodApplicationConfig = new CodeMemberMethod(); codeMemberMethodApplicationConfig.Attributes = MemberAttributes.Static | MemberAttributes.Public | MemberAttributes.Final; codeMemberMethodApplicationConfig.Name = "ConfigureApplication"; codeMemberMethodApplicationConfig.Parameters.Add(new CodeParameterDeclarationExpression("IApplicationBuilder", "app")); codeTypeDeclaration.Members.Add(codeMemberMethodApplicationConfig); codeMemberMethodApplicationConfig.Statements.Add(new CodeSnippetExpression("var option = new BackgroundJobServerOptions {WorkerCount = 1}")); codeMemberMethodApplicationConfig.Statements.Add(new CodeSnippetExpression("app.UseHangfireServer(option)")); codeMemberMethodApplicationConfig.Statements.Add(new CodeSnippetExpression("app.UseHangfireDashboard()")); foreach (var hook in domainHooks) { codeMemberMethodApplicationConfig.Statements.Add(new CodeSnippetExpression($"RecurringJob.AddOrUpdate<{_nameBuilderUtil.AsyncEventHookHandlerName(hook)}>(handler => handler.Run(), Cron.Minutely())")); } codeNamespace.Types.Add(codeTypeDeclaration); return(codeNamespace); }