ืงืืืืช ืืืคืชืืื ืฉื Raiffeisenbank .NET ืืืฉืืื ืืกืงืืจ ืืงืฆืจื ืืช ืืชืืื ืฉื ViennaNET. ืขื ืืื ืืืื ืืืขื ื ืืื,
ืืืืืจ ืื, ื ืขืืืจ ืขื ืกืคืจืืืช ืฉืืจื ื ืืฉืื ืืขืืืื ืขื ืขืกืงืืืช ืืืืืจืืช, ืชืืจืื ืืืกืื ื ืชืื ืื, ืืฉืจ ื ืืชื ืืืฆืื ืืืืืจ GitHub ืฉืื ื (
ViennaNET.Sagas
ืืืฉืจ ืคืจืืืงื ืขืืืจ ืืืจืืืืงืืืจืช DDD ื-microservice, ืื ืืืฉืจ ืืืืืืื ืืขืกืงื ืืืคืฅ ืขื ืคื ื ืฉืืจืืชืื ืฉืื ืื, ืืชืขืืจืจืช ืืขืื ืืงืฉืืจื ืืฆืืจื ืืืืฉืื ืื ืื ืื ืขืกืงื ืืืืืจ, ืืืืืื ืฉืืจืื ืชืจืืืฉืื ืจืืื ืืฉืคืืขืื ืขื ืืกืคืจ ืชืืืืื ืื-ืืื ืืช. ืืชื ืืืื ืืืืืจ ืื ืื ืื ืื ืืืื ืืืชืจ ืคืืจืื, ืืืฉื,
ืืคืจืืืงืืื ืฉืื ื, ืืืืขื ื ืื ืื ืื ืคืฉืื ืื ืฉืืืืฉื: ืกืืื, ืื ืืืชืจ ื ืืื ืกืืื ืืืืกืกืช ืชืืืืจ. ืืืืืช ืฉืื ืืื ืืืืงืื: ืืฉ ืชืจืืืฉ ืขืกืงื ืืกืืื ืฉืื ืืฉ ืฆืืจื ืืืฆืข ืคืขืืืืช ืืจืฆืฃ ืืฉืืจืืชืื ืฉืื ืื, ืืื ืืชืขืืจืจืืช ืืขืืืช ืืืฉืื ืืื ืฉืื, ืืฉ ืฆืืจื ืืงืจืื ืืืืื ืืืืจื ืืืืืจ ืขืืืจ ืื ืืฉืืืื ืืงืืืืื, ืฉืื ืืื ื ืืฆื ืืกืืคืง. ืื, ืืกืืฃ ืืกืืื, ืืื ืงืฉืจ ืืืฆืืื, ืื ื ืืงืืืื ื ืชืื ืื ืขืงืืืื ืืื ืืชืืืืื.
ืืืืฉืื ืฉืื ื ืขืืืื ื ืขืฉื ืืฆืืจืชื ืืืกืืกืืช ืืืื ื ืงืฉืืจ ืืฉืืืืฉ ืืื ืฉืืืืช ืฉื ืืื ืืจืืงืฆืื ืขื ืฉืืจืืชืื ืืืจืื. ืื ืื ืงืฉื ืืฉืืืืฉ: ืคืฉืื ืฆืืจ ืฆืืฆื ืฉื ืืืืงืช ืืืืกืืจืงื ืืืกืืกืืช 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. ืื ื ืืฉืชืืฉืื ืืืืฉืช DB-First ืืืืฆืขืืช Liquibase, ืื ืฉืืฉ ืจืง ืคืื ืงืฆืืื ืืืืช ืืขืืืื ืขื ื ืชืื ืื ืืืกื ื ืชืื ืื ืืืื.
ViennaNET.Orm.Seedwork ะธ ViennaNET.Orm
โ ืืืืืืื ืขืืงืจืืื ืืืืืืื ืืืฉืงืื ืืกืืกืืื ืืืืืขืืช ืฉืืื, ืืืชืืื. ืืืื ื ืกืชืื ืขื ืืชืืื ืฉืืื ืืืชืจ ืคืืจืื.
ืืืฉืง IEntityFactoryService
ืืืืฉืืื EntityFactoryService
ืื ื ืงืืืช ืืืืฆื ืืขืืงืจืืช ืืขืืืื ืขื ืืกื ืื ืชืื ืื, ืฉืื ืืื ื ืืฆืจืื ืืืืืช ืืขืืืื, ืืืืจืื ืืขืืืื ืขื ืืฉืืืืช ืกืคืฆืืคืืืช, ืืื ืื ืืืฆืขืื ืฉื ืคืงืืืืช ืืฉืืืืชืืช SQL ืืฉืืจืืช. ืืคืขืืื ื ืื ืืืืืื ืืช ืืืืืืืช ืฉื ืืืืงื ืืขืืืื ืขื ืืกื ื ืชืื ืื, ืืืฉื, ืืกืคืง ืืช ืืืืืืช ืืงืจืื ืจืง ื ืชืื ืื. ืืืงืจืื ืืืื IEntityFactoryService
ืืฉ ืืืฉืง ืงืืืื IEntityRepositoryFactory
, ืฉืืฆืืืจ ืจืง ืขื ืฉืืื ืืืฆืืจืช ืืืืจืื.
ืืื ืืืฉืช ืืฉืืจืืช ืืืกื ืื ืชืื ืื, ื ืขืฉื ืฉืืืืฉ ืืื ืื ืื ืืกืคืง. ืืื DBMS ืฉืื ื ืืฉืชืืฉืื ืืฆืืืชืื ืฉืื ื ืืฉ ืืืฉืื ืืฉืื: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql
.
ืืืงืืื, ื ืืชื ืืจืฉืื ืืกืคืจ ืกืคืงืื ืืืคืืืงืฆืื ืืืช ืืืงืืื, ืื ืฉืืืคืฉืจ ืืืฉื ืืืกืืจืช ืฉืืจืืช ืืื, ืืื ืื ืขืืืืืช ืืฉืื ืื ืืชืฉืชืืช, ืืืฆืข ืืืืจื ืฉืื ืืืจ ืฉืื ื- 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");
}
}
ืื ืืืื ืืืืืืจ ืื ืฆืืื, ืืืขืฉื ืฉืืืืฉ ืืืืืืจ ืืฉื "ืืจืืจืช ืืืื".
ืืืคืื ืืฉืืจ ืฉื ืืฉืืืืช ืืืืืืืช ืืกื ื ืชืื ืื ืืืืฉื ืืืืฆืขืืช ืืืื ืกืื ืืจืืืื ืฉื NHibernate. ืืชื ืืืื ืืืฉืชืืฉ ืืชืืืืจ ืื ืืจื ืงืืฆื xml ืืื ืืจื ืืืืงืืช. ืืืชืืื ื ืืื ืฉื ืืืืจื ืืื ืืืืืงืืช ืืืืื, ืืฉ ืกืคืจืื ViennaNET.TestUtils.Orm
.
ื ืืชื ืืืฆืื ืืืืืืืช ืืืืืช ืืฉืืืืฉ ื-ViennaNET.Orm.*
ViennaNET.Messaging.*
ืกื ืกืคืจืืืช ืืขืืืื ืขื ืชืืจืื.
ืืขืืืื ืขื ืชืืจืื, ื ืืืจื ืืืชื ืืืฉื ืืื ืขื DBMSs ืฉืื ืื, ืืืืืจ ืืืืฉื ืืืืืืืช ืืืงืกืืืืืช ืืืคืฉืจืืช ืืืืื ืช ืขืืืื ืขื ืืกืคืจืืื, ืืื ืงืฉืจ ืืื ืื ืืชืืจืื ืื ื ืขืฉื ืฉืืืืฉ. ืกึดืคึฐืจึดืึธื ViennaNET.Messaging
ืืืจืื ืืืืืง ืืืืืื ืืื, ื ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue ะธ ViennaNET.Messaging.KafkaQueue
ืืืืืื ืืืฉืืื ืืชืื ืขืืืจ IBM MQ, RabbitMQ ืืงืคืงื, ืืืชืืื.
ืืขืืืื ืขื ืชืืจืื ืืฉ ืฉื ื ืชืืืืืื: ืงืืืช ืืืืขื ืืฉืืืื.
ืฉืงืื ืืงืื. ืืฉ ืืื 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, ืื ืืืืืช ืืฆืืจื, ืชืืื ืืงืืืช ืืืฆืืจ ืืืืืฉื ืืืฉืง ืืฉืื. IMessageSerializer ะธ IMessageDeserializer
.
ื ืืกืื ื ืืฉืืจ ืืช ืืืืืืืช ืืืืืืืืืช ืฉื ืื ืื ืื ืชืืจ, ืืืฉื. ViennaNET.Messaging.MQSeriesQueue
ืืืคืฉืจ ืื ืืฉืืื ืื ืจืง ืืงืกื, ืืื ืื ืืืืขืืช ืืชืื, ื ViennaNET.Messaging.RabbitMQQueue
ืชืืื ืื ืืชืื ืืชืืจืื ืชืื ืืื ืืืกื. ืืขืืคืช ืืืชืื ืฉืื ื ืขืืืจ RabbitMQ ืืืืฉืืช ืื ืืจืืืช ืขืื ืฉื RPC: ืื ื ืฉืืืืื ืืืืขื ืืืืืื ืืชืืืื ืืชืืจ ืืื ื ืืืืื, ืฉื ืืฆืจ ืจืง ืขืืืจ ืืืืขืช ืชืืืื ืืืช.
ืืื
ViennaNET.CallContext
ืื ื ืืฉืชืืฉืื ืืชืืจืื ืื ืจืง ืืืื ืืืจืฆืื ืืื ืืขืจืืืช ืฉืื ืืช, ืืื ืื ืืชืงืฉืืจืช ืืื ืืืงืจื-ืฉืืจืืชืื ืฉื ืืืชื ืืคืืืงืฆืื, ืืืฉื, ืืชืื ืกืืื. ืื ืืืืื ืืฆืืจื ืืืขืืืจ ืืื ืขื ืืืืืขื ื ืชืื ืื ื ืืืืื ืืืื ืืชืืืจืืช ืืฉืชืืฉ, ืืืื ืืงืฉื ืืจืืฉืื ืืงืฆื ืืงืฆื, ืืชืืืช IP ืืงืืจ ืื ืชืื ื ืืจืฉืื. ืืื ืืืืฉื ืืช ืืขืืจืช ืื ืชืื ืื ืืืื, ืคืืชืื ื ืกืคืจืื ViennaNET.CallContext
, ืืืืคืฉืจ ืืืืกื ื ืชืื ืื ืืืงืฉื ืฉื ืื ืกืช ืืฉืืจืืช. ืืืงืจื ืื, ืืื ืืฉืืืืช ืืืืคื ืฉืื ืืืฆืขื ืืืงืฉื, ืืจื ืชืืจ ืื ืืืืฆืขืืช Http. ืืืืจ ืืื, ืืคื ื ืฉืืืืช ืืืงืฉื ืื ืืืืืขื ืืืืฆืืช, ืื ืชืื ืื ื ืืงืืื ืืืืงืฉืจ ืืืืืงืืื ืืืืชืจืืช. ืื, ืืฉืืจืืช ืืื ืืงืื ืืช ื ืชืื ื ืืขืืจ ืืื ืื ืืืชื ืืืืชื ืืืคื.
ืชืืื ืขื ืชืฉืืืช ืืื ืฉืื, ืื ื ืืฆืคืื ืืืขืจืืชืื ืืืืงืฉืืช ืฉืื!
ืืงืืจ: www.habr.com