欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

记一次autofac+dapper+mvc的框架搭建实践

程序员文章站 2022-04-08 16:49:39
1,环境 .net framework4.7.2,Autofac,Autofac.Mvc5,sql server 2,动机 公司项目用的是ef,之前留下代码的大哥,到处using,代码没有分层,连复用都么的,真的是够了。现在要重构原来的系统,本着高效、简洁、高耦合性的原则采用autofac + da ......

1,环境

.net framework4.7.2,autofac,autofac.mvc5,sql server

2,动机

公司项目用的是ef,之前留下代码的大哥,到处using,代码没有分层,连复用都么的,真的是够了。现在要重构原来的系统,本着高效、简洁、高耦合性的原则采用autofac + dapper的设计(其实我更像用core来做,core速度更快,配置更简单,而且我不想一直用老技术,但是公司大哥不让啊。。。)

3,代码

先引用如下几个包 autofac、autofac.mvc5、autofac.webapi2

记一次autofac+dapper+mvc的框架搭建实践

项目结构是这样,比较简单

记一次autofac+dapper+mvc的框架搭建实践

 

autofac 配置代码

 

using autofac;
using autofac.integration.mvc;
using autofac.integration.webapi;
using autofac.dapper.database;
using system.linq;
using system.reflection;
using system.web.http;
using system.web.mvc;
using system.web.optimization;
using system.web.routing;

namespace autofac.dapper.test
{
    public class mvcapplication : system.web.httpapplication
    {
        protected void application_start()
        {
            arearegistration.registerallareas();
            filterconfig.registerglobalfilters(globalfilters.filters);
            webapiconfig.register(globalconfiguration.configuration);
            routeconfig.registerroutes(routetable.routes);
            bundleconfig.registerbundles(bundletable.bundles);

            var builder = new containerbuilder();

            //注册controller
            builder.registercontrollers(assembly.getexecutingassembly());
            builder.registerapicontrollers(assembly.getexecutingassembly());


            //加载要注入的程序集
            var iservices = assembly.load("autofac.dapper.iservice");
            var services = assembly.load("autofac.dapper.service");

            //根据名称约定(服务层的接口和实现均以service结尾),实现服务接口和服务实现的依赖
            builder.registerassemblytypes(iservices, services)
              .where(t => t.name.endswith("service"))
              .asimplementedinterfaces().instanceperrequest();

            //注册主从库的连接对象,每次请求只有一个库的hashcode都是一个 这里分了俩个是为了读写分离设计的
            builder.registertype<dbmastersession>().instanceperrequest();
            builder.registertype<dbslaversession>().instanceperrequest();


            //创建一个autofac的容器
            var container = builder.build();
            //将mvc的控制器对象实例 交由autofac来创建
            dependencyresolver.setresolver(new autofacdependencyresolver(container));
            globalconfiguration.configuration.dependencyresolver = new autofacwebapidependencyresolver(container);
        }
    }
}

 dapper对象的代码

using system;
using system.collections.generic;
using system.configuration;
using system.data;
using system.data.sqlclient;
using system.linq;
using system.text;
using system.threading.tasks;

namespace autofac.dapper.database
{
    /// <summary>
    /// 公共的数据库连接管理类,用于使用autofac时可以自动关闭dbconnection
    /// </summary>
    public sealed class dbmastersession : idisposable
    {
        bool _disposed;
        /// <summary>
        /// 用于管理数据库连接
        /// </summary>
        public idbconnection dbconnection { get; set; }
        public dbmastersession()
        {
            dbconnection = new sqlconnection(configurationmanager.connectionstrings["masterconstr"].connectionstring);
        }
        /// <summary>
        /// 关闭dbconnection
        /// </summary>
        public void dispose()
        {
            if (this._disposed)
                return;

            this._disposed = true;

            if (this.dbconnection == null)
                return;

            if (this.dbconnection.state != connectionstate.closed)
                this.dbconnection.close();
        }
    }
}

 

 项目地址: https://gitee.com/siming.liu/autofac.dapper.web