• mvc4 web-api 与unity搭建接口


    对于接口重要的应该是 功能实现,合法性验证,性能监控,日志等模块

    通过unity aop功能可以实现统一的日志模块和性能监控。

    1、新建mvc4 webapi项目 nuget添加 unity 3.0+版本 和 unity.Interception

    2、重置mvc4 和webapi 的ioc容器:

     1 public class UnityDependencyResolver : System.Web.Mvc.IDependencyResolver, System.Web.Http.Dependencies.IDependencyResolver
     2     {
     3         private readonly IUnityContainer _unityContainer;
     4 
     5         public UnityDependencyResolver(IUnityContainer container)
     6         {
     7             this._unityContainer = container;
     8         }
     9 
    10         public object GetService(Type serviceType)
    11         {
    12             try
    13             {
    14                 return _unityContainer.Resolve(serviceType);
    15             }
    16             catch
    17             {
    18                 return null;
    19             }
    20         }
    21 
    22         public IEnumerable<object> GetServices(Type serviceType)
    23         {
    24             try
    25             {
    26                 return _unityContainer.ResolveAll(serviceType);
    27             }
    28             catch
    29             {
    30                 return new List<object>();
    31             }
    32         }
    33 
    34         public IDependencyScope BeginScope()
    35         {
    36             return this;
    37         }
    38 
    39         public void Dispose()
    40         {
    41         }
    42     }
     1  public class UnityConfig
     2     {
     3         public static void Register()
     4         {
     5             IUnityContainer container = new UnityContainer();
     6             container.AddNewExtension<Interception>(); //这里最重要
     7             container.LoadConfiguration();
     8             var unity = new UnityDependencyResolver(container);
     9             //设置mvc的依赖管理
    10             DependencyResolver.SetResolver(unity);
    11             //设置mvc的依赖管理
    12             GlobalConfiguration.Configuration.DependencyResolver = unity;
    13         }
    14     }

    3、在Global.asax 里调用:

     1   protected void Application_Start()
     2         {
     3             AreaRegistration.RegisterAllAreas();
     4 
     5             WebApiConfig.Register(GlobalConfiguration.Configuration);
     6             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
     7             RouteConfig.RegisterRoutes(RouteTable.Routes);
     8             BundleConfig.RegisterBundles(BundleTable.Bundles);
     9             UnityConfig.Register();
    10         }

    4、最后关于 unity的配置

     1  <configSections>
     2      <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration" />
     3   </configSections> <!-- 千万别忘了这里这是实现aop扩展 -->
     4 <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
     5     <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,Microsoft.Practices.Unity.Interception.Configuration" />
     6     <typeAliases>
     7       <!-- Lifetime manager types -->
     8       <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity" />
     9       <typeAlias alias="external" type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,Microsoft.Practices.Unity" />
    10       <typeAlias alias="perThread" type="Microsoft.Practices.Unity.PerThreadLifetimeManager,Microsoft.Practices.Unity" />
    11 
    12       <!-- User-defined type aliases -->
    13       <typeAlias alias="IBMapServer" type="CRM.Phone.Server.IBMapServer,CRM.Phone.Server" />
    14       <typeAlias alias="BMapServer" type="CRM.Phone.Server.BMapServer,CRM.Phone.Server" />
    15       <typeAlias alias="LoggingInterceptionBehavior" type="CRM.Phone.Interface.LoggingInterceptionBehavior,CRM.Phone.Interface" />
    16     </typeAliases>
    17     <container>
    18       <types>
    19         <!--<type type="IBMapServer" mapTo="BMapServer">
    20           <lifetime type="singleton" />
    21         </type>-->
    22       </types>
    23       <register type="IBMapServer" mapTo="BMapServer">
    24         <interceptor type="InterfaceInterceptor"/>
    25         <interceptionBehavior type="LoggingInterceptionBehavior"/>
    26       </register>
    27     </container>
    28   </unity>

    这里以IBMapserver 接口为例 对IMBapserver 中所有的方法进行拦截。

    5、在Controller里使用注入对象 使用Dependecy标签:

     1  public class BMapController : ApiController
     2     {
     3 
     4         [Dependency]
     5         public IBMapServer MapServer { get; set; }
     6 
     7         public Point GetPointByid(int id)
     8         {
     9             return MapServer.getPoint(id); 
    10         }
    11    }

    6、如果发现注入对象为空,而且没有报错,请一定注意文中 红色的部分

    7、最后贴一下 关于Logging处理代码

  • 相关阅读:
    mysql5.6 TIME,DATETIME,TIMESTAMP
    CMake 简单介绍 图
    mysql 源码编绎修改 FLAGS,调试MYSQL
    CHAR 详解
    关于MySQL的各种总结
    Shell编程速查手册
    cmake 手册系列
    编译安装GCC 5.2.0
    宽字符相关的输入输出
    Makefile
  • 原文地址:https://www.cnblogs.com/rufus-hua/p/4360795.html
Copyright © 2020-2023  润新知