CQRS dan Layanan Mikro dalam Pengembangan Produk

Cara mendesain produk agar tidak mengubur uang di dalam tanah


Pada tahap apa dalam penciptaan produk atau sistem untuk menghubungkan desain arsitektur sistem, sehingga nantinya tidak akan sangat menyakitkan bagi uang yang dihabiskan? Cara memutuskan apakah akan menggabungkan CQRS dan layanan microser.


Artikel ini ditujukan untuk perwakilan bisnis yang meminta pengembangan solusi TI. Kami akan menunjukkan kepada Anda cara meluncurkan produk dan menghindari biaya yang tidak dapat dibenarkan terkait dengan arsitektur. Dan juga melihat bagaimana menggunakan CQRS akan membantu implementasi fungsionalitas pada klien aplikasi yang berbeda, dan apakah layanan microsoft adalah obat mujarab.


Secara singkat tentang CQRS


CQRS (Command-Query Responsibility Segregation) - templat yang digunakan dalam pengembangan sistem, yang menyatakan bahwa metode apa pun dari sistem dapat berupa permintaan (tidak mengubah status sistem) atau perintah (mengubah status sistem). Seperti yang ditunjukkan oleh praktik, ini adalah salah satu pola yang paling umum digunakan dalam pengembangan perangkat lunak. Ini dapat digunakan pada level yang berbeda dan dalam situasi yang berbeda. Misalnya, pembagian sistem klasik menjadi OLTP / OLAP, ketika data sering ditulis ke sistem OLTP dan dibaca dari sistem OLAP, tidak lebih dari penggunaan templat CQRS dalam arsitektur basis data.



β€œβ€ ( 2000 ) CQRS. , Interbase/FirebirdSQL . . , , Query-, CRM- Command. CQRS JS . , JS … , , .



: A Big Ball of Mud



. , MVP , . , . β€” , . , . , .


, . , . , . .


: β€œ . , ”. , , , . β€œ ” . . . - , .



. , , . , . .


. , , . , . (Elastic ), - . , , - . , .


, , , . , - , - , . , . , , , .. 1 . - . , .


, , , , , . , . β€” . , , CAP-. , , .



β€”


/ . : , . .


/ , . . , , , .



, -, , , , . , -, (.. -), , , - .


, , . (.. ), , CRM- , . , , ..


?


- , , low-fidelity . Business Canvas ( ) , . , : -, . , . , . β€” ? : 2 . , , .


, . - - . , . , , (, COVID-19 !). CQRS .



- . CQRS .


:



, SOLID, Dependency Inversion Dependency Injection, , . , .


3 , :


  1. (Admin office Desktop App)
  2. (Ship Desktop Mechanic app)
  3. (SyncService)

, , , , . , Offline- , , . ? , , , . , β€” . - .


,


C#, .


/// <summary>
///       .
///       Composition Root(web api ,     ..)
/// </summary>
    public interface IHandlersFactory
    {
        IQueryHandler<TQuery, TResult> CreateQueryHandler<TQuery, TResult>();

        IAsyncQueryHandler<TQuery, TResult> CreateAsyncQueryHandler<TQuery, TResult>();

        ICommandHandler<TCommand> CreateCommandHandler<TCommand>();

        IAsyncCommandHandler<TCommand> CreateAsyncCommandHandler<TCommand>();
    }
/// <summary>
///       
/// </summary>
 public interface ICommandHandler<TCommand>
    {
        void Execute(TCommand command);
    }
/// <summary>
///       
/// </summary>

public interface IQueryHandler<TQuery, TResult>
    {
        TResult Execute(TQuery query);
    }

/// <summary>
///     Ninject,     
/// </summary>
public class NinjectFactory : IHandlersFactory
    {
        private readonly IResolutionRoot _resolutionRoot;

        public NinjectFactory(IResolutionRoot resolutionRoot)
        {
            _resolutionRoot = resolutionRoot;
        }

        public IAsyncCommandHandler<TCommand> CreateAsyncCommandHandler<TCommand>()
        {
            return _resolutionRoot.Get<IAsyncCommandHandler<TCommand>>();
        }

        public IAsyncQueryHandler<TQuery, TResult> CreateAsyncQueryHandler<TQuery, TResult>()
        {
            return _resolutionRoot.Get<IAsyncQueryHandler<TQuery, TResult>>();
        }

        public ICommandHandler<TCommand> CreateCommandHandler<TCommand>()
        {
            return _resolutionRoot.Get<ICommandHandler<TCommand>>();
        }

        public IQueryHandler<TQuery, TResult> CreateQueryHandler<TQuery, TResult>()
        {
            return _resolutionRoot.Get<IQueryHandler<TQuery, TResult>>();
        }
    }

Ninject


public override void Load()
        {
            // queries
            Bind<IQueryHandler<GetCertificateByIdQuery, Certificate>>().To<GetCertificateByIdQueryHandler>();
            Bind<IQueryHandler<GetCertificatesQuery, List<Certificate>>>().To<GetCertificatesQueryHandler>();
            Bind<IQueryHandler<GetCertificateByShipQuery, List<Certificate>>>().To<GetCertificateByShipQueryHandler>();
…………
}

IHandlerFactory :


:


Ship ship = mHandlersFactory.CreateQueryHandler<GetShipByIdQuery, Ship>().Execute(new GetShipByIdQuery(id));

:


mHandlersFactory.CreateCommandHandler<DeleteReportCommand>()
                    .Execute(new DeleteReportCommand(report));

, :


  1. , , .
  2. , , .
  3. , . /, . .
  4. , !

. . 300 . , 3 :


  1. - ? ?
  2. , ?
  3. ?

Bounded Context . , . .


CQRS


: MVVM, SOLID, CQRS .. . , .


, . : . , .



Agile- β€œ , , β€” ”. , β€” . , β€” . , , .


, . . -, . -, , . -, . , , .


All Articles