AutoFac+MVC+WebApi源码----我踩过的坑

发现网上关于AutoFac的Demo源码比较少,综合MVC和WepApi的更少。所以贴出源码

WebApi项目(MVC4不需要引用,历史遗留问题,人懒没删)

建项目

新建类库IAutoFacDal(接口),AutoFacDal,IAutoFacLogic(接口),AutoFacLogic,AutoFacDto(参数),AutoFacEntity(数据库实体)

新建WebApi

AutoFacEntity

User源码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace AutoFacEntity.DBModel
 8 {
 9     public class User
10     {
11         /// <summary>
12         /// 姓名
13         /// </summary>
14         public string Name { get; set; }
15         /// <summary>
16         /// 年龄
17         /// </summary>
18         public int Age { get; set; }
19         /// <summary>
20         /// 性别
21         /// </summary>
22         public string Sex { get; set; }
23     }
24 }

User

AutoFacDto

UserAddInputDto源码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace AutoFacDto.Input
 8 {
 9     public class UserAddInputDto
10     {
11         /// <summary>
12         /// 姓名
13         /// </summary>
14         public string Name { get; set; }
15         /// <summary>
16         /// 年龄
17         /// </summary>
18         public int Age { get; set; }
19         /// <summary>
20         /// 性别
21         /// </summary>
22         public string Sex { get; set; }
23     }
24 }

UserAddInputDto

UserModel源码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace AutoFacDto.Model
 8 {
 9     public class UserModel
10     {
11         /// <summary>
12         /// 姓名
13         /// </summary>
14         public string Name { get; set; }
15         /// <summary>
16         /// 年龄
17         /// </summary>
18         public int Age { get; set; }
19         /// <summary>
20         /// 性别
21         /// </summary>
22         public string Sex { get; set; }
23     }
24 }

UserModel

UserAddOutputDto源码

 1 using AutoFacDto.Model;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7
 8 namespace AutoFacDto.Output
 9 {
10     public class UserAddOutputDto
11     {
12         public UserModel Info { get; set; }
13     }
14 }

UserAddOutputDto

IAutoFacDal

IUserDal

IUserDal源码

 1  1 using AutoFacDto.Input;
 2  2 using AutoFacDto.Model;
 3  3 using AutoFacDto.Output;
 4  4 using System;
 5  5 using System.Collections.Generic;
 6  6 using System.Linq;
 7  7 using System.Text;
 8  8 using System.Threading.Tasks;
 9  9
10 10 namespace IAutoFacDal.User
11 11 {
12 12     public interface IUserDal
13 13     {
14 14         UserAddOutputDto UserAdd(UserAddInputDto input);
15 15     }
16 16 }

AutoFacDal

UserDal源码(另一个类无视)

 1 using IAutoFacDal.User;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 using AutoFacDto.Input;
 8 using AutoFacDto.Output;
 9 using AutoFacDto.Model;
10
11 namespace AutoFacDal.User
12 {
13     public class UserDal : IUserDal
14     {
15         public UserAddOutputDto UserAdd(UserAddInputDto input)
16         {
17             UserAddOutputDto output = new UserAddOutputDto { Info=new UserModel()};
18             output.Info.Age = input.Age;
19             output.Info.Name = input.Name+"--默认调用";
20             output.Info.Sex = input.Sex;
21             return output;
22         }
23     }
24 }

UserDal

IAutoFacLogic

IUserLogic源码

using AutoFacDto.Input;
using AutoFacDto.Output;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IAutoFacLogic.User
{
    public interface IUserLogic
    {
        UserAddOutputDto UserAdd(UserAddInputDto input);
    }
}

IUserLogic

AutoFacLogic

UserLogic源码(UserInfoLogic是我测试替换数据源的,可以无视)

 1 using IAutoFacLogic.User;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 using AutoFacDto.Input;
 8 using AutoFacDto.Output;
 9 using IAutoFacDal.User;
10
11 namespace AutoFacLogic.User
12 {
13     public class UserLogic : IUserLogic
14     {
15         public IUserDal iServerUerDal;
16
17         public UserLogic(IUserDal param)
18         {
19             iServerUerDal = param;
20         }
21         public UserAddOutputDto UserAdd(UserAddInputDto input)
22         {
23             return iServerUerDal.UserAdd(input);
24         }
25     }
26 }

AutoFacWebApi

WebApi项目默认是有代码并且能实现的

我只给出关键代码,如果需要Demo源码联系QQ85528445备注:博客园Autofac(Home里面有报错的话,把报错的删掉就能运行了)

using Autofac;
using Autofac.Integration.Mvc;
using Autofac.Integration.WebApi;
using AutoFacDal.User;
using AutoFacLogic.User;
using IAutoFacDal.User;
using IAutoFacLogic.User;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace AutoFacWebApi
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);

            //注册全局过滤器
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AutoFacStart();
        }
        #region 实现依赖注入
        /// <summary>
        /// 使用AutoFac实现依赖注入,
        /// </summary>
        public void AutoFacStart()
        {
            var builder = new ContainerBuilder();
            SetupResolveRules(builder);  //注入

            builder.RegisterControllers(Assembly.GetExecutingAssembly());  //注入Controller

            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());//注入APi
            builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);//注入APi
            builder.RegisterWebApiModelBinderProvider();//注入APi

            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//注入Controller

            var webApiResolver = new AutofacWebApiDependencyResolver(container);    //注入APi
            GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;  //注入APi
        }
        /// <summary>
        /// 注入规则
        /// </summary>
        /// <param name="builder"></param>
        protected void SetupResolveRules(ContainerBuilder builder)
        {
            //UI项目只用引用service和repository的接口,不用引用实现的dll。
            //如需加载实现的程序集,将dll拷贝到bin目录下即可,不用引用dll
            var IServicesBLL = Assembly.Load("IAutoFacLogic");
            var ServicesBLL = Assembly.Load("AutoFacLogic");

            var IServicesDAL = Assembly.Load("IAutoFacDal");
            var ServicesDAL = Assembly.Load("AutoFacDal");

            //实现服务接口和服务实现的依赖 业务逻辑层
            builder.RegisterAssemblyTypes(IServicesBLL, ServicesBLL).AsImplementedInterfaces();

            //实现服务接口和服务实现的依赖 数据层
            builder.RegisterAssemblyTypes(IServicesDAL, ServicesDAL).AsImplementedInterfaces();
            //特定条件的过滤注册-只注册结尾是User的
            //builder.RegisterAssemblyTypes(IServices, Services).Where(t => t.Name.EndsWith("User")).AsImplementedInterfaces();
            //使用新的覆盖旧的注册DLL-使用UserNew代替UserOld
            builder.RegisterType<UserLogic>().As<IUserLogic>();
            builder.RegisterType<UserInfoLogic>().As<IUserInfoLogic>();
            builder.RegisterType<UserDal>().As<IUserDal>();
        }
        #endregion
    }
}

Global

using AutoFacDto.Input;
using IAutoFacLogic.User;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace AutoFacWebApi.Controllers
{
    public class HomeController : Controller
    {
        private IUserLogic iServerUserLogic;
        private IUserInfoLogic iServerUserInfoLogic;

        /// <summary>
        /// 配置构造函数注入
        /// </summary>
        public HomeController(IUserLogic param,IUserInfoLogic param2)
        {
            iServerUserLogic = param;
            iServerUserInfoLogic = param2;
        }
        public ActionResult Index()
        {
            ViewBag.Title = "Home Page";

            UserAddInputDto input = new UserAddInputDto();
            input.Name = "Home Page";
            //动态调用Bll项目中的类方法
            //ViewBag.Title = iServerUserLogic.UserAdd(input).Info.Name;
            ViewBag.Title = iServerUserInfoLogic.UserAdd(input).Info.Name;
            return View();
        }
    }
}

HomeController

原文地址:https://www.cnblogs.com/shacoli/p/8523866.html

时间: 2024-07-30 02:15:21

AutoFac+MVC+WebApi源码----我踩过的坑的相关文章

Spring mvc之源码 handlerMapping和handlerAdapter分析

Spring mvc之源码 handlerMapping和handlerAdapter分析 本篇并不是具体分析Spring mvc,所以好多细节都是一笔带过,主要是带大家梳理一下整个Spring mvc的执行流程,以及如何根据URL查找处理器Controller的实现 (适合那些刚阅读源码不知道如何下手的人) http://www.guojinbao.com/borrow/borrowDetail/GETadLPjnf0[d].do 如何根据URL地址---->找到正确处理器Controller

MVC 路由源码解析

//到页面底部下载源,配合效果跟好. public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { RouteConfig.RegisterRoutes(RouteTable.Routes); //调用RouteConfig类的RegisterRoutes方法注册路由 //RouteTable.Routes是一个储存Route的集合 } } 我们转到RouteConf

eclipse中导入外部包却无法查看对应源码或Javadoc的 入坑指南

eclipse中导入外部包却无法查看对应源码或Javadoc的 入坑指南 出现这个错误的原因是,你虽然导入了.jar包,但没有配置对应的Javadoc或源码路径,所以在编辑器中无法查看源 码和对应API.接下来我们一起解决这个问题... 在项目名称上右击→ 新建→ 文件夹→ 文件名写lib→ 点击完成 然后把你下载的jar包,复制黏贴到这个lib文件夹 右击lib中的源码包→ 构建路径→ 添加至构建路径,自动生成一个"引用的库" 右击 "引用的库" 中的jar包→

ASP.NET MVC 4源码分析之如何定位控制器

利用少有的空余时间,详细的浏览了下ASP.NET MVC 4的源代码.照着之前的步伐继续前进(虽然博客园已经存在很多大牛对MVC源码分析的博客,但是从个人出发,还是希望自己能够摸索出这些).首先有一个事实我们需要明白,就是ASP.NET MVC是基于ASP.NET的,并不是独立开来的,所以我们的伊始将会从路由配置入手. 在开始本节之前,需要读者对ASP.NET的路由配置以及C#的扩展方法有一定的掌握,如果读者不理解请根据情况选择下面的文章进行充电: 1.ASP.NET路由映射 2.C#扩展方法

Spring MVC组件源码分析

组件概览 HandlerMapping 根据 request 找到对应的处理器 Handler 和 Interceptors.内部只有一个方法 HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception; HandlerAdapter Handler 适配器,内部方法如下: boolean supports(Object handler);//判断是否可以使用某个 Handler ModelAndVi

kibana 5.5 源码编译踩坑记录

由于项目需要定制开发kibana,因此需要编译kibana,在开发环境下运行. 注意:必须下载kibana 5.5的源码才能正常编译,下载release或者snapshot版本是不行的,运行npm start会因为无scripts目录报错. Setting Up kibana Development Environment Fork, then clone the kibana repo and change directory into it 下载kibana5.5源码解压后 cd kiban

Xposed源码编译踩坑实录

参考博文 参考掘金系列博文 参考博文 源码编译和镜像编译 参考博文 编译Xposed 参 考博文 https://www.jianshu.com/p/c731cd44e82b 参考博文 https://www.cnblogs.com/luoyesiqiu/p/9524651.html Xposed简介 Xposed是Android平台上的有名的Hook工具,用它可以修改函数参数,函数返回值和类字段值等等,也可以用它来进行调试.Xposed有几个部分组成:修改过的android_art,这个项目修

Unix 网络编程卷一源码编译踩坑记录 ubtutu 19.10

在阅读unpv1时运行源代码的环境配置,这里简单记录一下 源代码里的README 写得挺详细的,但是在Linux 系统的下还是没办法直接编译通过的, 这里我使用的是ubuntu 19.10(在腾讯云ubuntu server 18.04.1也测试通过) 以下是简单的步骤: 1.下载源码并解压 2.解压源代码后得到unpv13e, 3.开始编译 cd unpv13e ./configure cd lib make cd ../libfree make 这时报错:inet_ntop.c: In fu

Autofac - MVC/WebApi中的应用

参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/asp-net-core-overview.html http://www.yuanjiaocheng.net/ASPNET-CORE/asp.net-core-environment.html http://www.yuanjiaocheng.net/ASPNET-CORE/newproject.html http://www.yuanjiaocheng.net/webapi/web-api-gais