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处理代码

 

posted @ 2015-03-23 19:33  沐松  阅读(1153)  评论(0编辑  收藏  举报