αα ααααα’αααα’αα·αααααα Raiffeisenbank .NET αααααα·αα·αααααΎαααααΉαααΆααααα ViennaNET αααααααααα α’αααΈαααα αα·αααΌαα ααα»αααααΎαααααα
αα
αααα»αα’αααααααα ααΎαααΉαααααααΆαααααααΆαααααααα·αααΆααααααΌαααΆααα·α
αΆαααΆαααααΆααααααΎααΆαααΆαα½αααααα·ααααα·ααΆαα
ααα
αΆα αα½α αα·αααΌαααααΆααα·αααααα αααα’αΆα
ααααΌαααΆαααααΎααα
αααα»αααααΆαα GitHub ααααααΎα (
ViennaNET.Sagas
αα
ααααααααααααααααΌααα
DDD αα·αααααΆααααααααααΈααααΌααααΆ αααααΆαααααα
αααααααααααα·ααααΆα’αΆααΈαααααααααΌαααΆαα
ααα
αΆααα
ααΌααΆααααααΆαααααααααα αααα αΆααΎαα‘αΎαααΆααααααΉααααααΌαααΆααααα»αααΆαα’αα»ααααααααααΆαααααα·ααααα·ααΆαα
ααα
αΆα ααΈαααααααααΆααΈαααΌααΆα
αααΎαααΆααΏαααααααΆααααααααααΆα
αααΎααααα»αααααααα½αα α’αααα’αΆα
ααααΆααααααααΆαααααααα±ααααΆααααα’α·αααααααααα α§ααΆα αααα
αα αααα»αααααααααααααΎα ααΎαααΆαα’αα»ααααααααααΆαααααΆαααααα½α ααα»ααααααΆαααααααααα ααΏαααααααα·ααΆα α¬ααΆαα·ααΆα ααα’ααααΎααααααααα ααααΉαααΆαααααααΆααΆαααΌα ααΆααααααα ααΆαααααΆααΈαααΌα’αΆααΈαααααααΆααααΆαααα½α αααα αΆαααΆα αααααΌαα’αα»ααααααααα·ααααα·ααΆαααΆαααααααααΆαααα αααα»αααααΆαααααααααα α αΎαααααα·αααΎαααα αΆααΆαα½αααΎαα‘αΎααααα»αααα αΆαααΆαα½α αααα αΆαααΆα αααααΌαα α αα ααΈαα·αα·ααΈ rollback αααααΆααααα αΆααα»αααΆααα’αα αααααΆαααααααααααΆααΆαα ααΆααααααα ααΌα ααααα αΎα αα α α»ααααα ααααααΏααα·ααΆα ααααα·ααα·αααΈααΆααααααα ααΎαααα½αααΆααα·ααααααααααααααΆαα αααα»ααααααΆααα’ααα
ααΆαα’αα»ααααααααααΎααα ααααααΎα‘αΎααααα»αααααααααΆααΌαααααΆαααααααΆ α αΎααα·αααΆααααΆααααααΉαααΆαααααΎααααΆαααα·ααΈααΆαααααααΆαα½αααα’ααααααααααΆαα½αααααΆααααααααααααα ααΆαα·ααα·ααΆααααα»αααΆαααααΎααα ααααΆαααααααααΎαααΆααΌαα α ααααααΆααα’ααΌααΈααΌαααααΆα SagaBase<T> ααα T ααΊααΆααααΆααααα·ααααααα’ααα αααα’αααα’αΆα αααααΆαα»ααα·ααααααααααΌααααα αΆαααΆα ααααααΆαα saga ααΎααααΈααααΎαααΆα ααααΌα ααΆααααααααααα·αααααααα½αα ααα½ααααααα ααα·ααβα§ααΆα αααβααΉαβααααΌαβααααβααΆααβαα βαααααβααα αΆαβαααα»αβαααβααααα·ααααα·α Saga αααα½αααΆααΊααΆααααΆααααααΆααααα ααΌα ααααααααα»α’αΆα ααααΌαααΆαααΆαααααα»α DI ααΆ Singleton ααΎααααΈααα½αααΆαααΆαα’αΆαααααα αΆαααΆα αα
α§ααΆα αααααΆαααααΆαααΆαα·αααααααα
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.ααααΎααΆαα*
αααα»ααααααααΆααααααααΆααααααΎααΆαααΆαα½ααα½αα
ααΎααααΈααααΎααΆαααΆαα½ααα½α αα·ααΈααΆαααααααΌα
ααααΆααααΌαααΆαααααΎαααΎαααΌα
ααααΆααΉα DBMSs ααααααααα αααααΊαα·ααΈααΆαααααααααα½αααααα½αα’αα·ααααΆαααα’αΆα
ααααΎαα
ααΆααααα»αααααααααααααΆαααααΎααΆαααΆαα½ααααααΆααα ααααα·ααα·αααΈαααααα·ααΈααααααααααα½ααααααΆαααααΎα αααααΆααα ViennaNET.Messaging
ααα½ααα»αααααΌααααΆαααΆααααΆααα
ααααααΆαααααα½αααααα½αααα αα·α ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue ΠΈ ViennaNET.Messaging.KafkaQueue
ααΆαααΆαα’αα»ααααα’αΆααΆααααααααααΆαα IBM MQ, RabbitMQ αα·α Kafka αααααααΆα
αα αααααααΎααΆαααΆαα½ααα½αααΆαααααΎαααΆαααΈα: ααα½αααΆααα·αααααΎααΆα
αα·α
αΆαααΆααα½αα ααΆααααααΎα 2 αα
ααΈαααα αααααΆααααΆαααααΆααααΆαααααααααΆαα αα·ααααααΆααααΆαααα½αααΆααααα½αα ααΎααααΈααααΆαααα½αααΆαααααααααΆαα α’αααααααΌααααααααΆα’αααΈααααΆααααααΎαααΆααααααΆαααα½αααααααΈ IMessageProcessor
αααααΉαααα½ααα»αααααΌααααα»αααααΎαααΆαααΆαα
αΌαα αααααΆααααααΆααααΌαααααααΌαααΆα "ααααΆαα" αα
αα½αααΆααααΆαααα½α ααΆααααΌαααΆαααααΎααΆααααααΆαα
α»ααααααα
αΌα IQueueReactorFactory
αααα αΆαβα’ααααααααΆαβαα½αβααΈβααΆαβαααααβαα
ααΆααααααααα
"messaging": {
"ApplicationName": "MyApplication"
},
"rabbitmq": {
"queues": [
{
"id": "myQueue",
"queuename": "lalala",
...
}
]
},
α§ααΆα αααααααΆαα αΆααααααΎαααααΆααα
_queueReactorFactory.Register<MyMessageProcessor>("myQueue");
var queueReactor = queueReactorFactory.CreateQueueReactor("myQueue");
queueReactor.StartProcessing();
αααααΆαααα αα ααααααααααΆααααα αΆααααααΎα α αΎααα·ααΈααΆαααααααααΌαααΆαα α α±ααα αΆααααααΎαααααΆαα ααΆαααΆααα’ααααΈαα½ααααααΆααααααΆααααΉααα ααΆαα processor αααααααΌαααααΆα
ααΎααααΈααα½αααΆαααΆααααα½ααα
αααα»αα
ααα»α
αααααΆαααααα
ααα 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