zoukankan      html  css  js  c++  java
  • Asp.Net MVC 之 Autofac 初步使用3 集成web api

    今天我们试着在WebApi2实现autofac的注入,关于这方面也是看了几位园友的分享省了不少时间,所以结合着前篇的demo再新建webapi进行...

    demo3下载地址:  http://pan.baidu.com/s/1eSCAZtC

    一样开篇还是发下大概demo结构:

     

    还是nuget安装 Autofac 以及 Autofac ASP.NET MVC 5  Integration 、Autofac ASP.NET WEB API 2.2 Integration

     看到有园友说属性注入存在安全隐患,官方的建议是使用构造函数注入。

    特意找了一下相关的内容,不过不确定观点是否正确,有明白的朋友麻烦可以告知下,我也好补充下让更多朋友明白哈,在此感谢。

    优缺点:

    1. 属性注入直白易懂,缺点是对于属性可选的时候,很多个构造函数会显得类很臃肿。

    2. 构造注入是一种高内聚的体现,特别是针对有些属性需要在对象在创建时候赋值,且后续不允许修改(不提供setter方法)。

    不啰嗦了,主要还是贴下WebApi2的Global文件,里面主要关注关于mvc与webapi注册的地儿(红色部分)

     #region 自动注入
                //创建autofac管理注册类的容器实例
                var builder = new ContainerBuilder();
                HttpConfiguration config = GlobalConfiguration.Configuration;
                Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
                //注册所有实现了 IDependency 接口的类型
                Type baseType = typeof(IDependency);
                builder.RegisterAssemblyTypes(assemblies)
                       .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
                       .AsSelf().AsImplementedInterfaces()
                       .PropertiesAutowired().InstancePerLifetimeScope();
                //注册MVC类型
                // builder.RegisterControllers(assemblies).PropertiesAutowired();
                //注册Api类型
                builder.RegisterApiControllers(assemblies).PropertiesAutowired();
                //builder.RegisterFilterProvider();
                builder.RegisterWebApiFilterProvider(config);
                var container = builder.Build();
                //注册api容器需要使用HttpConfiguration对象
                config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
                //注册解析
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
                #endregion

    新添加 TestController

    [RoutePrefix("api/Test")]
        public class TestController : ApiController
        {
            readonly IUserRepository repository;
            //构造器注入
            public TestController(IUserRepository repository)
            {
                this.repository = repository;
            }
    
            [HttpGet]
            public HttpResponseMessage Index()
            {
                return MessageToJson.ToJson(repository.GetAll());
            }
        }

    MessageToJson 只是把结果转了一下json

      //需添加  System.Web.Extensions.dll  引用
            public static HttpResponseMessage ToJson(Object obj)
            {
                String str;
                if (obj is String || obj is Char)
                {
                    str = obj.ToString();
                }
                else
                {
                    var serializer = new JavaScriptSerializer();
                    str = serializer.Serialize(obj);
                }
                var result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
                return result;
            }

    最后来测试下结果:

    访问/api/Test/Index

    作者:_Burt

    出处:http://www.cnblogs.com/Burt/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    抽象类和接口
    truncate,delete和drop的区别
    PLSQL乱码问题
    Linux
    myEclipse闪退
    Java 中 Synchronized 的使用
    工厂模式
    Java中的File,IO流
    jQuery的学习
    C++中的标准模板库STL
  • 原文地址:https://www.cnblogs.com/Burt/p/6513917.html
Copyright © 2011-2022 走看看