Autofac, Rebus, AutoMapper

Autofac, Rebus, AutoMapper

Tags
Tech
Published
Author

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 사이λ₯Ό λ§€ν•‘ν•΄μ£ΌκΈ°μœ„ν•΄μ„œ μ‚¬μš©
  1. MapperConfiguration
    1. MapperConfiguration 객체λ₯Ό μƒμ„±ν•˜μ—¬ λ§€ν•‘ 섀정을 μ •μ˜
  1. CreateMap<A, B>
    1. A ν΄λž˜μŠ€μ—μ„œ B 클래슀둜의 맀핑을 μ •μ˜
  1. ForMember
    1. λ§€ν•‘ κ·œμΉ™μ„ μ„ΈλΆ€μ μœΌλ‘œ μ •μ˜
    2. destination β‡’ destination.AId : A클래슀의 AId속성에 λŒ€ν•΄ 맀핑을 μ„€μ •
    3. options β‡’ options.MapFrom(Source β‡’ source.b_id) : B 클래슀의 b_id 속성을 A 클래슀의 AId μ†μ„±μœΌλ‘œ λ§€ν•‘
  1. MapFrom
    1. λ§€ν•‘ μ†ŒμŠ€ 속성을 μ§€μ •
Β