Autofac通用集成方案(支持.net core、.net framework 4.6.1平台)
为了保证团队代码可阅读性、风格统一性、降低代码耦合性,我在网上搜索了非常多的ioc框架,最终我选择了autofac,因为autofac在.net平台中非常活跃,性能也非常不错,同时支持.net core 平台和.net framework,并且其框架集成进项目中对开发者上来说基本上没有什么侵入性,这点我是特别喜欢,我喜欢干净而又富有内涵的代码。有关于autofac的详细测评大家可以参考这篇文章:https://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html
为了让autofac方便集成,我思考了许久,把现有的Service(业务组件)类库拆分成了4个组件,并用.net standard2.0(更加通用)来编写这几个类库,分别为:
Service.Model(模型层):每个业务层从数据库读取数据之后都需要转换成适合业务的业务模型,避免UI层访问数据库模型对象。
Service.Interface(接口层):每个对外的业务都需要定义成接口,并且写清楚注释,方便调用者调用,调用者无需知道具体实现。
Service.Core(业务层):每个具体的业务实现在此实现,并且继承各自的接口,并实现其对外公开的方法。
Service.Config(配置层):业务层中所有的基本配置都在这里实现,比如ioc、redis、数据层等初始化操作。
具体依赖关系图如下:
我根据这个关系图,做出了autofac的demo。
如果开发要开发一个新业务,具体的步骤是这样的:
(1)确定业务需求---->(2)设计业务模型---->(3)编写接口---->(4)编写业务类---->(5)在配置中注册这个业务类
如果需要在asp.net web api中引用这个Service,
首先需要引入Service.Interface、Service.Model、Service.Config三大组件,然后需要在App_Start中WebApiConfig类中编写如下代码即可:
//创建autofac容器构建器 var builder = new ContainerBuilder(); //初始化Service ServiceConfig.Buider.InitIoc(builder); //WebApi 注册 builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).AsSelf().PropertiesAutowired(); builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); builder.RegisterWebApiModelBinderProvider(); //替换web api默认的ioc容器 var webApiResolver = new AutofacWebApiDependencyResolver(builder.Build()); GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;
然后接下来你只需在控制器中定义业务接口属性就能调用业务对象的方法了:
using Service.Inferface; using Service.Model; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace WebApplication1.Controllers { public class ValuesController : ApiController { public IMenuService MenuService { get; set; } // GET api/values public IEnumerable<string> Get() { Menu menu = new Menu() { Name = "菜单管理", Url = "/api/menu" }; return new string[] { "value1", "value2", MenuService.Add(menu) }; } } }
以上来看,autofac对代码侵入性很低。
如果需要在.net core web api中引用这个Service。
注册过程(Startup类中修改ConfigureServices方法):
public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddMvc(); var builder = new ContainerBuilder(); ServiceConfig.Buider.InitIoc(builder); builder.Populate(services); IContainer ApplicationContainer = builder.Build(); return new AutofacServiceProvider(ApplicationContainer); }
引用方式:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Service.Inferface; using Service.Model; namespace WebApplication2.Controllers { [Route("api/[controller]")] public class ValuesController : Controller { public ValuesController(IMenuService menuService) { this.MenuService = menuService; } public IMenuService MenuService { get;private set; } // GET api/values [HttpGet] public IEnumerable<string> Get() { Menu menu = new Menu() { Name = "菜单管理", Url = "/api/menu" }; return new string[] { "value1", "value2", MenuService.Add(menu) }; } } }
具体代码:https://gitee.com/qianyunjie/AutofacDeme,欢迎大家下载查阅。