一种软件架构的设想

我做开发不到两年,经验不多,但是平时喜欢看资料,有些新奇的想法。

今天和大家探讨一下我设想的软件架构,草图如下:

名词解释

功能接口

接口是对功能的声明,对模块的划分。传统的三层架构,有很多业务逻辑层的方法纯粹的就是调用一下数据访问层,写起来没意思,特别是用了ORM过后,数据访问层本来代码就不多,还用业务逻辑层包一下就更没有必要。我干脆就把接口做成一层,需要业务逻辑类就加相关业务逻辑的接口,不需要就不加,避免了不必要的代码。所有的模块都是通过这些接口进行相互调用的,使得整个程序非常方便扩展。而且上层可以调用数据访问层或业务逻辑层任意接口,这样代码就比较灵活。

接口实现

假设ServiceA.dll是专门做爬虫的,ServiceB.dll是专门访问数据库的,爬虫模块的数据需要保存到数据库中,那么ServiceA调用InterfaceB即可。每个实现类可以通过接口访问任何其他功能模块,所以接口实现类的编码十分灵活。

对外公布

例如Winform、网站、WebAPI,这些外部能直接访问到的。它们做的是数据格式转换、数据验证、身份验证,它们通过调用功能接口从而执行相关功能模块。

Castle.Core

这是一个开源项目,它通过Emit的方式生成一个接口的实现类,这个实现类的每一个方法里都会调用拦截器。每当我们调用接口函数的时候,拦截器就会被触发,这种模式叫做AOP。因为我们的所有模块都是通过接口相互调用的,所以所有的调用都可以被拦截,在拦截器里,可以为每一个接口方法添加额外的功能,比如日志记录,缓存。如果在Castle.Core的拦截器里实现远程通信,Castle.Core创建的代理对象就是一个远程代理对象。如草图所示,ServiceA调用InterfaceB,如果把InterfaceB的实例换成远程代理对象,就可以在不修改任何代码的基础上将ServiceB.dll放到远程服务器上执行。

Autofac

这是一个依赖注入容器,可以在上层(对外公布层)用于创建接口的实例。你可以使用它来配置哪个接口使用哪个类来实例化,这样对于需要接口实例的地方不依赖也不用关心具体实现类型。

结语

这是我设想的一种软件架构,我认为他具有很高的灵活性和可扩展性,但没有在实际项目中应用过,欢迎各位斧正。

猜你喜欢

转载自blog.csdn.net/qq_32069969/article/details/81592972