- <p align="right">
- <a href="https://github.com/dotnetcore/CAP/blob/master/README.zh-cn.md">中文</a>
- </p>
-
- # CAP
-
- [![Travis branch](https://img.shields.io/travis/dotnetcore/CAP/master.svg?label=travis-ci)](https://travis-ci.org/dotnetcore/CAP)
- [![AppVeyor](https://ci.appveyor.com/api/projects/status/4mpe0tbu7n126vyw?svg=true)](https://ci.appveyor.com/project/yuleyule66/cap)
- [![NuGet](https://img.shields.io/nuget/vpre/DotNetCore.CAP.svg)](https://www.nuget.org/packages/DotNetCore.CAP/)
- [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/dotnetcore/CAP/master/LICENSE.txt)
-
- CAP is a .Net Standard library to achieve eventually consistent in distributed architectures system like SOA,MicroService. It is lightweight,easy to use and efficiently.
-
- ## OverView
-
- CAP is a library that used in an ASP.NET Core project, Of Course you can ues it in ASP.NET Core with .NET Framework.
-
- You can think of CAP as an EventBus because it has all the features of EventBus, and CAP provides a easier way to handle the publishing and subscribing than EventBus.
-
- CAP has the function of Message Presistence, and it makes messages reliability when your service is restarted or down. CAP provides a Publish Service based on Microsoft DI that integrates seamlessly with your business services and supports strong consistency transactions.
-
- This is a diagram of the CAP working in the ASP.NET Core MicroService architecture:
-
- ![](http://images2015.cnblogs.com/blog/250417/201707/250417-20170705175827128-1203291469.png)
-
- > The solid line in the figure represents the user code, and the dotted line represents the internal implementation of the CAP.
-
- ## Getting Started
-
- ### NuGet (Coming soon)
-
- You can run the following command to install the CAP in your project.
-
- If your Message Queue is using Kafka, you can:
-
- ```
- PM> Install-Package DotNetCore.CAP.Kafka -Pre
- ```
-
- or RabbitMQ:
-
- ```
- PM> Install-Package DotNetCore.CAP.RabbitMQ -Pre
- ```
-
- CAP provides EntityFramework as default database store extension :
-
- ```
- PM> Install-Package DotNetCore.CAP.EntityFrameworkCore -Pre
- ```
-
- ### Configuration
-
- First,You need to config CAP in your Startup.cs:
-
- ```cs
- public void ConfigureServices(IServiceCollection services)
- {
- ......
-
- services.AddDbContext<AppDbContext>();
-
- services.AddCap()
- .AddEntityFrameworkStores<AppDbContext>()
- .AddKafka(x => x.Servers = "localhost:9092");
- }
-
- public void Configure(IApplicationBuilder app)
- {
- .....
-
- app.UseCap();
- }
-
- ```
-
- ### Publish
-
- Inject `ICapPublisher` in your Controller, then use the `ICapPublisher` to send message
-
- ```cs
- public class PublishController : Controller
- {
- private readonly ICapPublisher _publisher;
-
- public PublishController(ICapPublisher publisher)
- {
- _publisher = publisher;
- }
-
-
- [Route("~/checkAccount")]
- public async Task<IActionResult> PublishMessage()
- {
- //Specifies the message header and content to be sent
- await _publisher.PublishAsync("xxx.services.account.check", new Person { Name = "Foo", Age = 11 });
-
- return Ok();
- }
- }
-
- ```
-
- ### Subscribe
-
- **Action Method**
-
- Add the Attribute `[CapSubscribe()]` on Action to subscribe message:
-
- ```cs
- public class PublishController : Controller
- {
- private readonly ICapPublisher _publisher;
-
- public PublishController(ICapPublisher publisher)
- {
- _publisher = publisher;
- }
-
-
- [NoAction]
- [CapSubscribe("xxx.services.account.check")]
- public async Task CheckReceivedMessage(Person person)
- {
- Console.WriteLine(person.Name);
- Console.WriteLine(person.Age);
- return Task.CompletedTask;
- }
- }
-
- ```
-
- **Service Method**
-
- If your subscribe method is not in the Controller,then your subscribe class need to Inheritance `ICapSubscribe`:
-
- ```cs
-
- namespace xxx.Service
- {
- public interface ISubscriberService
- {
- public void CheckReceivedMessage(Person person);
- }
-
-
- public class SubscriberService: ISubscriberService, ICapSubscribe
- {
- [CapSubscribe("xxx.services.account.check")]
- public void CheckReceivedMessage(Person person)
- {
-
- }
- }
- }
-
- ```
-
- Then inject your `ISubscriberService` class in Startup.cs
-
- ```cs
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddTransient<ISubscriberService,SubscriberService>();
- }
- ```
-
- ## Contribute
-
- One of the easiest ways to contribute is to participate in discussions and discuss issues. You can also contribute by submitting pull requests with code changes.
-
- ### License
-
- [MIT](https://github.com/dotnetcore/CAP/blob/master/LICENSE.txt)
|