C#.NET MVC中IOC容器 AutoFac的简单使用

网上查看了很多文章,照着复制的代码,始终不对,后面发现有些是缺少引用,有些缺失代码,我这里也是照搬被人的代码做了一些改动,先上项目结构图:
新建WEB MVC项目,我使用的VS是2017版
新建WEB MVC项目
1,添加引用,使用nugut添加两个引用:Autofac,Autofac.Mvc5(很多别的文章都没有说要添加Autofac.Mvc5,可能是使用的版本不一样,这里都使用的最新版)
2,Model添加一个实体类

    public class UserInfo
    {
        public string Name { get; set; }

        public int Age { get; set; }
    }

3,Iservice添加一个接口

    public interface IUserInfoService
    {
        List<UserInfo> GetUsers();
    }

4,Service实现接口

  public class UserInfoService : IUserInfoService
    {
        public List<UserInfo> GetUsers()
        {

            var list = new List<UserInfo>();
            list.Add(new UserInfo { Age = 18, Name = "张三" });
            list.Add(new UserInfo { Age = 25, Name = "李四" });
            list.Add(new UserInfo { Age = 25, Name = "王五" });
            return list;
        }
    }

5,正式使用,在MVC项目中创建一个autofac的注册类

  public class AutofacConfig
    {
        /// <summary>
        /// 负责调用autofac框架实现业务逻辑层和数据仓储层程序集中的类型对象的创建
        /// 负责创建MVC控制器类的对象(调用控制器中的有参构造函数),接管DefaultControllerFactory的工作
        /// </summary>
        public static void Register()
        {
            //实例化一个autofac的创建容器
            var builder = new ContainerBuilder();

            //告诉Autofac框架,将来要创建的控制器类存放在哪个程序集 (AutoFacMvcDemo)
            Assembly controllerAss = Assembly.Load("AutofacIOCDemo");
            builder.RegisterAssemblyModules(controllerAss);
	
            builder.RegisterControllers(Assembly.GetExecutingAssembly());

            //如果有Dal层的话,注册Dal层的组件
            //告诉autofac框架注册数据仓储层所在程序集中的所有类的对象实例
            //Assembly dalAss = Assembly.Load("IService");
            //创建respAss中的所有类的instance以此类的实现接口存储
            //builder.RegisterTypes(dalAss.GetTypes()).AsImplementedInterfaces();

            //告诉autofac框架注册业务逻辑层所在程序集中的所有类的对象实例
            Assembly serviceAss = Assembly.Load("Service");

            //创建serAss中的所有类的instance以此类的实现接口存储
            builder.RegisterTypes(serviceAss.GetTypes()).AsImplementedInterfaces();


            //创建一个Autofac的容器
            var container = builder.Build();
            //将MVC的控制器对象实例 交由autofac来创建
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
    }

6,在Global的Application_Start中启用autofac注册类

 protected void Application_Start()
        {
   			//注册
            AutofacConfig.Register();

            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

7,在控制器中调用获取userinfo数据,并在视图中展示出来

        private IUserInfoService userinfoService;
        public HomeController(IUserInfoService _userinfoService,) {
             userinfoService = _userinfoService;
        }
        public ActionResult Index()
        {
            List<UserInfo> users = userinfoService.GetUsers();
             ViewBag.users = users;
            return View();
        }
@{
    ViewBag.Title = "Home Page";
}

@foreach (var item in ViewBag.users)
{
    <tr>
        <td>@item.Age</td>
        <td>@item.Name</td>
    </tr>
}

8,补充单个注册的方式,之前的方式是用注册类注册所有的Service,这里是单个注册,不用注册类

   protected void Application_Start()
        {

            // 创建autofac管理注册类的容器实例
            var builder = new ContainerBuilder();
            //注册组件(注意:在注册时添加了UserInfoService的引用,其实还是耦合的,在不分层的项目中好用)
            builder.RegisterType<UserInfoService>().As<IUserInfoService>();
            //使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            //生成具体的实例
            //var container = builder.Build();
            //下面就是使用MVC的扩展 更改了MVC中的注入方式.
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));



            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

9,原文地址:https://www.cnblogs.com/wyy1234/p/9144669.html,我这里做了一点改动,刚学习,有不对的地方或者可以改进的地方请大家指点一下,谢谢

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET Framework 使用 MVC 架构时,可以使用依赖注入(Dependency Injection,简称 DI)来解决对象之间的依赖关系。依赖注入是一种设计模式,通过将对象的创建和管理委托给外部容器来实现。 在 MVC 使用依赖注入的好处是可以降低代码的耦合性,提高可维护性和可测试性。以下是在 .NET Framework MVC 使用依赖注入的一般步骤: 1. 配置依赖注入容器:您可以使用第三方的依赖注入容器,如 Autofac、Unity、Ninject 等,或者使用 .NET Framework 自带的简单容器(如 `UnityContainer`)。 2. 注册依赖项:在配置阶段,您需要将控制器、服务、存储库等需要被注入的对象注册到容器。这样容器就能够识别和管理这些对象。 3. 声明依赖关系:在需要使用依赖项的地方(如控制器的构造函数),通过构造函数或属性注入等方式声明依赖关系。容器会自动解析和提供所需的对象实例。 4. 解析依赖项:在运行时,容器会根据对象的声明和注册信息来解析依赖关系,并将所需的对象实例提供给相应的对象。 下面是一个使用 .NET Framework MVC 和 Unity 容器的示例: 首先,安装 Unity 容器的 NuGet 包(例如通过 NuGet 包管理器控制台运行 `Install-Package Unity`)。 然后,在 Global.asax.cs 文件的 Application_Start 方法配置 Unity 容器: ```csharp protected void Application_Start() { // 创建 Unity 容器 var container = new UnityContainer(); // 注册依赖项 container.RegisterType<IMyService, MyService>(); // 设置 MVC 依赖解析器为 UnityDependencyResolver DependencyResolver.SetResolver(new UnityDependencyResolver(container)); // 其他 MVC 配置... } ``` 接下来,在控制器声明依赖关系: ```csharp public class MyController : Controller { private readonly IMyService _myService; public MyController(IMyService myService) { _myService = myService; } // 控制器动作方法... } ``` 现在,当 MVC 框架创建 MyController 实例时,Unity 容器会自动解析 IMyService 接口的实现(如 MyService),并将其注入到控制器的构造函数。 这样,您就可以通过依赖注入来实现对象之间的解耦和灵活性,使代码更加可测试和可扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值