Raiffeisenbank .NET éçºè
ã³ãã¥ããã£ã¯ãViennaNET ã®å
容ãç°¡åã«ã¬ãã¥ãŒãç¶ããŠããŸãã ç§ãã¡ãããã«è³ã£ãçµç·¯ãšçç±ã«ã€ããŠã¯ã
ãã®èšäºã§ã¯ãåæ£ãã©ã³ã¶ã¯ã·ã§ã³ããã¥ãŒãããŒã¿ããŒã¹ãæäœããããã®ãŸã æ€èšãããŠããªãã©ã€ãã©ãªã«ã€ããŠèª¬æããŸãããããã®ã©ã€ãã©ãªã¯ GitHub ãªããžã㪠(
ãŠã£ãŒã³ããããµã¬ã¹
ãããžã§ã¯ãã DDD ããã³ãã€ã¯ããµãŒãã¹ ã¢ãŒããã¯ãã£ã«åãæ¿ãããããžãã¹ ããžãã¯ãããŸããŸãªãµãŒãã¹ã«åæ£ããããšãå€ãã®ã·ããªãªãäžåºŠã«è€æ°ã®ãã¡ã€ã³ã«åœ±é¿ãäžããããšãå€ããããåæ£ãã©ã³ã¶ã¯ã·ã§ã³ ã¡ã«ããºã ã®å®è£
ã®å¿
èŠæ§ã«é¢é£ããåé¡ãçºçããŸãã ãã®ãããªã¡ã«ããºã ã«ã€ããŠããã«è©³ããç¥ãããšãã§ããŸããããšãã°ã
ç§ãã¡ã®ãããžã§ã¯ãã§ã¯ãã·ã³ãã«ã ã䟿å©ãªã¡ã«ããºã ãã€ãŸããªãŒã±ã¹ãã¬ãŒã·ã§ã³ããŒã¹ã®ç©èªãå®è£ ããŸããã ãã®æ¬è³ªã¯æ¬¡ã®ãšããã§ããããŸããŸãªãµãŒãã¹ã§æäœãé çªã«å®è¡ããå¿ èŠãããç¹å®ã®ããžãã¹ ã·ããªãªããããããããã®ã¹ãããã§åé¡ãçºçããå Žåã¯ãåã®ãã¹ãŠã®ã¹ãããã®ããŒã«ãã㯠ããã·ãŒãžã£ãåŒã³åºãå¿ èŠããããŸããæäŸãããã ãããã£ãŠãç©èªã®çµããã«ã¯ãæåã«é¢ä¿ãªãããã¹ãŠã®ãã¡ã€ã³ã§äžè²«ããããŒã¿ãåãåããŸãã
ç§ãã¡ã®å®è£ ã¯ãŸã åºæ¬çãªåœ¢åŒã§äœæãããŠãããä»ã®ãµãŒãã¹ãšå¯Ÿè©±ããæ¹æ³ã®äœ¿çšã«ã¯é¢é£ä»ããããŠããŸããã 䜿ãæ¹ã¯é£ãããããŸãããåºæ¬æœè±¡ã¯ã©ã¹ SagaBase<T> ã®åå«ãäœæããã ãã§ããT ã¯ããµã¬ãåäœããããã«å¿ èŠãªåæããŒã¿ãšããã€ãã®äžéçµæãæ ŒçŽã§ããã³ã³ããã¹ã ã¯ã©ã¹ã§ãã ã³ã³ããã¹ã ã€ã³ã¹ã¿ã³ã¹ã¯ãå®è¡äžã«ãã¹ãŠã®ã¹ãããã«æž¡ãããŸãã Saga èªäœã¯ã¹ããŒãã¬ã¹ ã¯ã©ã¹ã§ãããããã€ã³ã¹ã¿ã³ã¹ãã·ã³ã°ã«ãã³ãšã㊠DI ã«é 眮ããŠãå¿ èŠãªäŸåé¢ä¿ãååŸã§ããŸãã
åºåã®äŸ:
public class ExampleSaga : SagaBase<ExampleContext>
{
public ExampleSaga()
{
Step("Step 1")
.WithAction(c => ...)
.WithCompensation(c => ...);
AsyncStep("Step 2")
.WithAction(async c => ...);
}
}
åŒã³åºãã®äŸ:
var saga = new ExampleSaga();
var context = new ExampleContext();
await saga.Execute(context);
ããŸããŸãªå®è£
ã®å®å
šãªäŸã衚瀺ã§ããŸã
ViennaNET.Orm.*
Nhibernate ãä»ããŠããŸããŸãªããŒã¿ããŒã¹ãæäœããããã®ã©ã€ãã©ãªã®ã»ããã Liquibase ã䜿çšãã DB-First ã¢ãããŒãã䜿çšããŠãããããæ¢è£œã®ããŒã¿ããŒã¹å ã®ããŒã¿ãæäœããæ©èœã®ã¿ããããŸãã
ViennaNET.Orm.Seedwork О ViennaNET.Orm
â åºæ¬çãªã€ã³ã¿ãŒãã§ã€ã¹ãšãã®å®è£
ãããããå«ãã¡ã€ã³ ã¢ã»ã³ããªã ãããã®å
容ãããã«è©³ããèŠãŠã¿ãŸãããã
ã€ã³ã¿ãŒãã§ãŒã¹ IEntityFactoryService
ãšãã®å®è£
EntityFactoryService
äœæ¥åäœãç¹å®ã®ãšã³ãã£ãã£ãæäœããããã®ãªããžããªãããã³ã³ãã³ãã®å®è¡ããã°ã©ã ãçŽæ¥ SQL ã¯ãšãªãããã§äœæããããããããŒã¿ããŒã¹ãæäœããããã®äž»ãªéå§ç¹ã«ãªããŸãã å Žåã«ãã£ãŠã¯ãããŒã¿ããŒã¹ãæäœããã¯ã©ã¹ã®æ©èœãå¶éãããšäŸ¿å©ãªå ŽåããããŸã (ããšãã°ãããŒã¿ã®èªã¿åãã®ã¿ã®æ©èœãæäŸãããªã©)ã ãã®ãããªå Žåã«åã㊠IEntityFactoryService
ç¥å
- ã€ã³ã¿ãŒãã§ã€ã¹ããããŸã IEntityRepositoryFactory
ããªããžããªãäœæããã¡ãœããã®ã¿ã宣èšããŸãã
ããŒã¿ããŒã¹ã«çŽæ¥ã¢ã¯ã»ã¹ããã«ã¯ããããã€ã㌠ã¡ã«ããºã ã䜿çšãããŸãã ç§ãã¡ã®ããŒã ã§äœ¿çšããå DBMS ã«ã¯ç¬èªã®å®è£
ããããŸãã ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql
.
åæã«ãè€æ°ã®ãããã€ããŒã XNUMX ã€ã®ã¢ããªã±ãŒã·ã§ã³ã«åæã«ç»é²ã§ãããããããšãã°ãã€ã³ãã©ã¹ãã©ã¯ãã£ãå€æŽããã³ã¹ãããããã«ãXNUMX ã€ã®ãµãŒãã¹ã®ãã¬ãŒã ã¯ãŒã¯å ã§ã次ã®ãµãŒãã¹ãã段éçãªç§»è¡ãå®è¡ã§ããŸãããã DBMS ããå¥ã® DBMS ãžã å¿ èŠãªæ¥ç¶ãã€ãŸãç¹å®ã®ãšã³ãã£ã㣠ã¯ã©ã¹ (ããŒã¿ããŒã¹ ããŒãã«ãžã®ãããã³ã°ãæžã蟌ãŸãã) ã®ãããã€ããŒãéžæããã¡ã«ããºã ã¯ããšã³ãã£ãã£ã BoundedContext ã¯ã©ã¹ (ãã¡ã€ã³ ãšã³ãã£ãã£ãç»é²ããã¡ãœãããå«ã) ãŸãã¯ãã®åŸç¶ã¯ã©ã¹ã«ç»é²ããããšã§å®è£ ãããŸãã ApplicationContext (ã¢ããªã±ãŒã·ã§ã³ ãšã³ãã£ãã£ãçŽæ¥ãªã¯ãšã¹ããããã³ã³ãã³ããç»é²ããããã®ã¡ãœãããå«ãŸããŸã)ãæ§æããã®æ¥ç¶èå¥åãåŒæ°ãšããŠåãå ¥ããããŸãã
"db": [
{
"nick": "mssql_connection",
"dbServerType": "MSSQL",
"ConnectionString": "...",
"useCallContext": true
},
{
"nick": "oracle_connection",
"dbServerType": "Oracle",
"ConnectionString": "..."
}
],
ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã®äŸ:
internal sealed class DbContext : ApplicationContext
{
public DbContext()
{
AddEntity<SomeEntity>("mssql_connection");
AddEntity<MigratedSomeEntity>("oracle_connection");
AddEntity<AnotherEntity>("oracle_connection");
}
}
æ¥ç¶ ID ãæå®ãããŠããªãå Žåã¯ããdefaultããšããååã®æ¥ç¶ã䜿çšãããŸãã
ãšã³ãã£ãã£ã®ããŒã¿ããŒã¹ ããŒãã«ãžã®çŽæ¥ãããã³ã°ã¯ãæšæºã® NHibernate ããŒã«ã䜿çšããŠå®è£
ãããŸãã ãã®èª¬æã¯ãxml ãã¡ã€ã«ãšã¯ã©ã¹ã®äž¡æ¹ãéããŠäœ¿çšã§ããŸãã åäœãã¹ãã§ã¹ã¿ã ãªããžããªãç°¡åã«äœæã§ããããã«ãã©ã€ãã©ãªããããŸãã ViennaNET.TestUtils.Orm
.
ViennaNET.Orm.* ã®å®å
šãªäœ¿çšäŸãèŠã€ããããšãã§ããŸãã
ViennaNET.Messaging.*
ãã¥ãŒãæäœããããã®ã©ã€ãã©ãªã®ã»ããã
ãã¥ãŒãæäœããã«ã¯ãããŸããŸãª DBMS ãšåãã¢ãããŒããã€ãŸãã䜿çšãããã¥ãŒ ãããŒãžã£ãŒã«é¢ä¿ãªããã©ã€ãã©ãªã®æäœã«é¢ããŠå¯èœãªéãæ倧éã®çµ±äžã¢ãããŒããéžæãããŸããã å³æžé€š ViennaNET.Messaging
ãŸãã«ãã®çµ±äžã«è²¬ä»»ãè² ã£ãŠããã ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue О ViennaNET.Messaging.KafkaQueue
ãããããIBM MQãRabbitMQãKafka ã®ã¢ããã¿ãŒå®è£
ãå«ãŸããŠããŸãã
ãã¥ãŒãæäœããå Žåãã¡ãã»ãŒãžã®åä¿¡ãšéä¿¡ãšãã XNUMX ã€ã®ããã»ã¹ãååšããŸãã
åãåãããšãæ€èšããŠãã ããã ããã«ã¯ 2 ã€ã®ãªãã·ã§ã³ããããŸããåžžæãªãã¹ã³ããå Žåãšãåäžã®ã¡ãã»ãŒãžãåä¿¡ããå Žåã§ãã ãã¥ãŒãåžžã«ãªãã¹ã³ããã«ã¯ãæåã«ãã¥ãŒããç¶æ¿ãããããã»ããµ ã¯ã©ã¹ãèšè¿°ããå¿
èŠããããŸãã IMessageProcessor
ãåä¿¡ã¡ãã»ãŒãžã®åŠçãæ
åœããŸãã 次ã«ãç¹å®ã®ãã¥ãŒã«ããªã³ã¯ãããå¿
èŠããããŸããããã¯ããžã®ç»é²ãéããŠè¡ãããŸãã IQueueReactorFactory
æ§æããã®ãã¥ãŒèå¥åã瀺ããŸãã
"messaging": {
"ApplicationName": "MyApplication"
},
"rabbitmq": {
"queues": [
{
"id": "myQueue",
"queuename": "lalala",
...
}
]
},
ãªã¹ãã³ã°ãéå§ããäŸ:
_queueReactorFactory.Register<MyMessageProcessor>("myQueue");
var queueReactor = queueReactorFactory.CreateQueueReactor("myQueue");
queueReactor.StartProcessing();
次ã«ããµãŒãã¹ãéå§ãããã¡ãœãããåŒã³åºãããŠãªã¹ãã³ã°ãéå§ãããšãæå®ããããã¥ãŒããã®ãã¹ãŠã®ã¡ãã»ãŒãžã察å¿ããããã»ããµã«éãããŸãã
ãã¡ã¯ããªã€ã³ã¿ãŒãã§ã€ã¹ã§åäžã®ã¡ãã»ãŒãžãåä¿¡ããã«ã¯ IMessagingComponentFactory
æ¹æ³ããããŸã CreateMessageReceiver
ããã«ãããæå®ããããã¥ãŒããã®ã¡ãã»ãŒãžãåŸ
æ©ããåä¿¡è
ãäœæãããŸãã
using (var receiver = _messagingComponentFactory.CreateMessageReceiver<TestMessage>("myQueue"))
{
var message = receiver.Receive();
}
ã¡ãã»ãŒãžãéä¿¡ããã«ã¯ åããã®ã䜿çšããå¿
èŠããããŸã IMessagingComponentFactory
ãããŠã¡ãã»ãŒãžéä¿¡è
ãäœæããŸãã
using (var sender = _messagingComponentFactory.CreateMessageSender<MyMessage>("myQueue"))
{
sender.SendMessage(new MyMessage { Value = ...});
}
ã¡ãã»ãŒãžã®ã·ãªã¢ã«åãšéã·ãªã¢ã«åã«ã¯ãããã¹ããXMLãJSON ã® XNUMX ã€ã®æ¢è£œã®ãªãã·ã§ã³ããããŸãããå¿
èŠã«å¿ããŠç¬èªã®ã€ã³ã¿ãŒãã§ã€ã¹å®è£
ãç°¡åã«äœæã§ããŸãã IMessageSerializer О IMessageDeserializer
.
ç§ãã¡ã¯ãåãã¥ãŒãããŒãžã£ãŒã®åºæã®æ©èœãä¿æããããåªããŠããŸããã ViennaNET.Messaging.MQSeriesQueue
ããã¹ãã ãã§ãªããã€ãã¡ãã»ãŒãžãéä¿¡ã§ããŸãã ViennaNET.Messaging.RabbitMQQueue
ã«ãŒãã£ã³ã°ãšãªã³ã¶ãã©ã€ãã¥ãŒã€ã³ã°ããµããŒãããŸãã RabbitMQ ã®ã¢ããã¿ãŒ ã©ãããŒããRPC ã®é¡äŒŒç¹ãå®è£
ããŠããŸããã€ãŸããã¡ãã»ãŒãžãéä¿¡ããXNUMX ã€ã®å¿çã¡ãã»ãŒãžã«å¯ŸããŠã®ã¿äœæãããç¹å¥ãªäžæãã¥ãŒããã®å¿çãåŸ
ã¡ãŸãã
ããã§
ViennaNET.CallContext
ãã¥ãŒã¯ãç°ãªãã·ã¹ãã éã®çµ±åã ãã§ãªããããšãã°ããµã¬å
ã®åãã¢ããªã±ãŒã·ã§ã³ã®ãã€ã¯ããµãŒãã¹éã®éä¿¡ã«ã䜿çšãããŸãã ãã®ããããŠãŒã¶ãŒ ãã°ã€ã³ããšã³ãããŒãšã³ã ãã®ã³ã°çšã®èŠæ±èå¥åãéä¿¡å
IP ã¢ãã¬ã¹ãèªèšŒããŒã¿ãªã©ã®è£å©ããŒã¿ãã¡ãã»ãŒãžãšäžç·ã«éä¿¡ããå¿
èŠããããŸããã ãã®ããŒã¿ã®è»¢éãå®è£
ããããã«ãã©ã€ãã©ãªãéçºããŸããã ViennaNET.CallContext
ããã«ããããµãŒãã¹ã«å
¥ããªã¯ãšã¹ãããã®ããŒã¿ãä¿åã§ããŸãã ãã®å Žåããªã¯ãšã¹ãããã¥ãŒãéããŠè¡ãããããHTTP çµç±ã§è¡ããããã¯é¢ä¿ãããŸããã 次ã«ãéä¿¡ãªã¯ãšã¹ããŸãã¯ã¡ãã»ãŒãžãéä¿¡ããåã«ãããŒã¿ãã³ã³ããã¹ãããååŸãããããããŒã«é
眮ãããŸãã ãããã£ãŠã次ã®ãµãŒãã¹ã¯è£å©ããŒã¿ãåä¿¡ããåãæ¹æ³ã§ç®¡çããŸãã
ãæž
èŽããããšãããããŸããã³ã¡ã³ãããã«ãªã¯ãšã¹ãããåŸ
ã¡ããŠãããŸãã
åºæïŒ habr.com