# 来自官方的定义。
>Seneca is a toolkit for writing microservices and organizing the business logic of your app.
>Seneca是一个用于编写微服务和组织应用程序业务逻辑的工具包。
# 主要关注点。
Seneca的主要功能点都体现在它的插件中。可以说Seneca框架本身并不包含任何用于开发的功能点,在你执行完npm install seneca之后,除了seneca本身,它自带的三个内置核心插件也被安装了进来。这三个分别是:
1. **basic插件**
Seneca运行基础,提供以模式匹配的方式建立接口到实现的连接。为了解释清楚这个插件,请看下面两段代码:
第一段代码:
``` javascript
const seneca = require('seneca')();

seneca.add({ role: 'math', cmd: 'add' }, (msg, reply) => {
reply(null, { answer: msg.left + msg.right })
})

seneca.act({ role: 'math', cmd: 'add', left: 1, right: 1 }, (err, result) => {
if (err) return console.log(err);
console.log(result);
})
```
第一行中的add()函数是在Seneca中注册一个action,add()函数的第一个参数是该action的pattern,第二个参数是该action的定义。第二行中的act()函数作用是发送msg给Seneca中注册的action,第一个参数是msg本身,第二个参数是执行完action的回调。接收到的msg会和所有action中的pattern进行匹配,Seneca会选择一个有最相近的匹配的action执行。action的第一参数msg则是通过act()发送的msg。
如果在控制台运行这段代码会在控制台打印出{answer:2}。
第二段代码:
``` javascript
const seneca = require('seneca')();

seneca.add({ role: 'math' }, (msg, reply) => {
reply(null, { result: "匹配到{role:'math'}" })
})

seneca.add({ a: 2 }, (msg, reply) => {
reply(null, { result: "匹配到{a:2}" })
})

seneca.add({ cmd: 'add', a: 2 }, (msg, reply) => {
reply(null, { result: "匹配到{ cmd: 'add', a: 2}" })
})

seneca.act({ role: 'math', cmd: 'add', a: 2, left: 1, right: 1 }, (err, result) => {
if (err) return console.log(err);
console.log(result);
})
```
之前有说到Seneca的最相近匹配原则,那什么叫做最相近呢?如果执行上面这段代码,如果在控制台运行这段代码会在控制台打印出{result:'匹配到{cmd:\'add\',a:2}'}。看起来似乎是从右往左寻找最长匹配项。
2. **web插件**
提供web api路由功能,将http request通过解析url路由到Seneca action。
3. **transport插件**
提供两个远程Seneca端之间基于http和tcp的通信通道。
 
# 写在最后
文章结束的时候,我们已经知道如何借助Seneca的basic插件实现控制反转。下一篇文章将介绍如何将api发布成web api。
[GitHub-senecajs/seneca](https://github.com/senecajs/seneca)