zoukankan      html  css  js  c++  java
  • 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处理代码

  • 相关阅读:
    WSP部署错误—SharePoint管理框架中的对象“SPSolutionLanguagePack Name=0”依赖其他不存在的对象
    Elevate Permissions To Modify User Profile
    Error with Stsadm CommandObject reference not set to an instance of an object
    ASP.NET MVC3添加Controller时没有Scaffolding options
    测试使用Windows Live Writer写日志
    配置TFS 2010出现错误—SQL Server 登录的安全标识符(SID)与某个指定的域或工作组帐户冲突
    使用ADO.NET DbContext Generator出现错误—Unable to locate file
    CSS
    HTML DIV标签
    数据库
  • 原文地址:https://www.cnblogs.com/rufus-hua/p/4360795.html
Copyright © 2011-2022 走看看