Autofac
IoC(Inversion of Control) 컨ν
μ΄λ
- κ°μ²΄μ μμ±κ³Ό μλͺ κ΄λ¦¬ λ° μμ‘΄μ± μ£Όμ μ μλμΌλ‘ μ²λ¦¬
- 컨νΈλ‘€λ¬, μλΉμ€, μ μ₯μ λ±μ νμν μμ‘΄ κ°μ²΄λ₯Ό μμ±μλ μμ±, λ©μλλ₯Ό ν΅ν΄ μ£Όμ
Autofac - Module
Autofacμμ λͺ¨λμ Autofac.Core.IModule μΈν°νμ΄μ€λ₯Ό ꡬν
- ControllerModule : Controller
- DbContextModule : DB connect
- DbJobModule : Scheduling
- ServiceModule : Service
Module - *.Module.cs
ex)
builder.RegisterType<ProcessBOMController>().PropertiesAutowired();
builder
: Autofacμμ 컨ν μ΄λ λΉλ(Container Builder)μ μΈμ€ν΄μ€, μμ‘΄μ± λ±λ‘ λ° κ΅¬μ± μμ μ λ΄λΉ
RegisterType<ProcessBOMController>()
:ProcessBOMController
ν΄λμ€λ₯Ό λ±λ‘νλ€λ μλ―Έ
.PropertiesAutowired()
: μμ± μ£Όμ (Property Injection)μ νμ±ν
μΊ‘μνλ ꡬμ±
Microsoft.Extensions.Configuration
.Module.Config.json { "modules" : [{ "type" : "MyNamespace.(...)Modulem, MyAssembly", "Properties" : { ... } }] }
builder.Host.ConfigureContainer<ContainerBuilder>( b => { var configBuilder = new ConfigurationBuilder().AddJsonFile("autofac.json", true, true); var config = configBuilder.Build(); b.RegisterModule(new ExtendConfigurationModule(config)); var path = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location)!, "Configurations"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } Directory.GetFiles(path).Where(f => new FileInfo(f).Extension.EndsWith("json")).ToList().ForEach(f => { var subConfigBuilder = new ConfigurationBuilder().AddJsonFile(f, true, true); var subConfig = subConfigBuilder.Build(); b.RegisterModule(new ExtendConfigurationModule(subConfig)); builder.Configuration.AddJsonFile(f, true, true); }); b.RegisterSource<ContravariantRegistrationSource>(); b.RegisterType<BusinessObjectDocumentBuilder>().As<IBusinessObjectDocumentBuilder>().SingleInstance(); } );
Rebus
μ ν리μΌμ΄μ
κ³Ό νμ λ©μ»€λμ¦ μ¬μ΄μ μΆμν κ³μΈ΅μΌλ‘ μλ
builder.RegisterRebus((configurer, context) => { var queueName = "mes-queue"; var subscriberStore = new InMemorySubscriberStore(); // ꡬλ μ 보λ₯Ό λ©λͺ¨λ¦¬μ μ μ₯νλ ν΄λμ€ var inMemNetwork = new InMemNetwork(true); // λ©λͺ¨λ¦¬ λ΄μμλ§ λ©μμ§λ₯Ό μ‘μμ ν μ μλλ‘ λμμ£Όλ κ°μ§ λ€νΈμν¬ configurer .Logging(l => l.ColoredConsole()) // color console log μΆλ ₯ .Transport(x => x.UseInMemoryTransport(new InMemNetwork(true), queueName, false)) // message broker connect .Subscriptions(s => s.StoreInMemory(new InMemorySubscriberStore())) // Pub/Sub ꡬλ μ μ 보 μ μ₯μ μ§μ .Options(x => { x.SetMaxParallelism(1); }); return configurer; }); // λͺ¨λ μμ‘΄μ± λ±λ‘μ λλ΄κ³ λΉλλ₯Ό μλ£ν μ§νμ λμ builder.RegisterBuildCallback(c => { var bus = c.Resolve<IBus>(); var assembly = typeof(ProcessCustomerPartyMaster).Assembly; foreach (var type in assembly.GetTypes()) { if (type.IsAssignableTo(typeof(BusinessObjectDocumentBase)) && !type.IsAbstract) { bus.Subscribe(type).GetAwaiter().GetResult(); // λ©μμ§ κ΅¬λ } } }); builder.Register(c => { var context = c.Resolve<IComponentContext>(); var config = context.Resolve<MapperConfiguration>(); return config.CreateMapper(context.Resolve); }).As<IMapper>().InstancePerLifetimeScope(); builder.RegisterType<MappingService>().As<IMappingService>().InstancePerLifetimeScope(); builder.RegisterType<ServiceBusClient>().As<IServiceBusClient>().InstancePerLifetimeScope();
Quartz
quartz.config
quartz.scheduler.instanceName = MyScheduler quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz quartz.threadPool.maxConcurrency = 3
quartz.scheduler.instanceName
: μ€μΌμ€λ¬ μ΄λ¦
quartz.jobStore.type
: μμ λ° νΈλ¦¬κ±°μ μΈλΆ μ 보 λ± Quartzμ λͺ¨λ λ°μ΄ν°λ λ©λͺ¨λ¦¬μ 보κ΄
quartz.threadPool.maxConcurrency
: μ΅λ 3κ°μ μμ μ λμμ μ€ν κ°λ₯(κΈ°λ³Έμ 10κ°)
QuartzAutofacFactoryModule
: Quartz μλΉμ€ DI λ±λ‘, Quartz μ체 κ΄λ¦¬QuartzAutofacJobsModule
: Job ν΄λμ€λ€μ DI λ±λ‘, Jobμ νμν μμ‘΄μ± μλ μ£Όμ
Service Broker Setting
execsys.sp_cdc_enable_db go exec sys.sp_cdc_enable_table @source_schema = 'Purchase', @source_name = 'PurchaseOrder', @role_name = 'cdcrole', @supports_net_changes = 1 go
- νλ‘κ·Έλλ° κΈ°λ₯ - ν¨μ - ν μ΄λΈ λ°ν ν¨μ
- cdc.fn_cdc_get_all_changes_Purchase_PurchaseOrder
- cdc.fn_cdc_get_net_changes_Purchase_PurchaseOrder
νλ‘μμ (dbo.CreateDocument, dbo.SendDocument) μμ±
Automapper
ν κ°μ²΄λ₯Ό λ€λ₯Έ κ°μ²΄μ λ§€ννλ μ½λλ₯Ό μμ κΈ° μν΄μ λ§λ€μ΄μ§ λΌμ΄λΈλ¬λ¦¬
μ μ¬μ©νλκ°?
λλ©μΈ κ°μ²΄μ viewmodel μ¬μ΄λ₯Ό λ§€νν΄μ£ΌκΈ°μν΄μ μ¬μ©
MapperConfiguration
- MapperConfiguration κ°μ²΄λ₯Ό μμ±νμ¬ λ§€ν μ€μ μ μ μ
CreateMap<A, B>
- A ν΄λμ€μμ B ν΄λμ€λ‘μ λ§€νμ μ μ
ForMember
- λ§€ν κ·μΉμ μΈλΆμ μΌλ‘ μ μ
destination β destination.AId
: Aν΄λμ€μ AIdμμ±μ λν΄ λ§€νμ μ€μ options β options.MapFrom(Source β source.b_id)
: B ν΄λμ€μ b_id μμ±μ A ν΄λμ€μ AId μμ±μΌλ‘ λ§€ν
MapFrom
- λ§€ν μμ€ μμ±μ μ§μ
Β