开始之前,如果没接触过Autofac的,可以移步到Autofac官方示例学习一下怎么使用:https://github.com/autofac/Examples

.net 下集成steeltoe进行微服务客户端的注册与发现均需要使用Autofac依赖注入方式进行,且MVC,WebAPI,webForm三种项目类型所需要依赖扩展库都不一样,经过两周的踩坑,现在做个粗浅的总结吧!

以下是steeltoe官方文档给出的参考:

App Type Package Description
Console/ASP.NET 4.x Steeltoe.Discovery.EurekaBase Base functionality. No dependency injection.
ASP.NET Core Steeltoe.Discovery.ClientCore Includes base. Adds ASP.NET Core dependency injection.
ASP.NET 4.x with Autofac Steeltoe.Discovery.ClientAutofac Includes base. Adds Autofac dependency injection.
App Type Package Description
Console/ASP.NET 4.x Pivotal.Discovery.EurekaBase Base functionality. No dependency injection.
ASP.NET Core Pivotal.Discovery.ClientCore Includes base. Adds ASP.NET Core dependency injection.
ASP.NET 4.x with Autofac Pivotal.Discovery.ClientAutofac Includes base. Adds Autofac dependency injection.

经过两周的各自尝试,基于Framework4.5.2+的MVC,WebAPI,webForm等项目基本都是用Autofac方式进行服务注册和调用方法的引用,所以所需要引入的扩展库基本都是以Autofac结尾,比如上面的Steeltoe.Discovery.ClientAutofac和Pivotal.Discovery.ClientAutofac。

另外我们还需要用到的类库包括:

Steeltoe.Common.Autofac

这个类库包含了服务发现与调用的方法。

三种类型的项目目录结构是不同的,MVC与WebAPI都是有ApiController接口的,可以自己构建controller集成接口,然后直接用Autofac的依赖注入方式进行微服务调用方法的实现,代码可参考如下:

 public class ValuesController : ApiController
{
private readonly DiscoveryHttpClientHandler _handler; public ValuesController(IDiscoveryClient client, ILoggerFactory logFactory)//这里就是注入依赖了
{
_handler = new DiscoveryHttpClientHandler(client);
} // GET api/values
public async Task<string> Get()
{ var client = new HttpClient(_handler, false); return await client.GetStringAsync("http://java-server/hi?name=demo");
} // GET api/values/5
public string Get(int id)
{
String re = id.ToString; return re; } // POST api/values
public void Post([FromBody]string value)
{
} // PUT api/values/5
public void Put(int id, [FromBody]string value)
{
} // DELETE api/values/5
public void Delete(int id)
{
}
}

  

那么webForm怎么调用微服务的方法呢?这就需要我们自己写一个服务类,在类中实现自定义接口和用依赖注入的方式对steeltoe提供的方法调用,然后在Page里依赖注入自己的这个类了。参考代码:

自定义服务接口类IFetchService.cs:

 public interface IFetchService
{
Task<string> RandomFortuneAsync();
}

自定义服务类并完成steeltoe接口方法的依赖注入与实现FetchService.cs:

public class FetchService : IFetchService
{
DiscoveryHttpClientHandler _handler; private const string RANDOM_FORTUNE_URL = "http://java-service/hi?name=tian";
private ILogger<FetchService> _logger; public FetchService(IDiscoveryClient client, ILoggerFactory logFactory = null)
{
_handler = new DiscoveryHttpClientHandler(client);
_logger = logFactory?.CreateLogger<FetchServise>();
} public async Task<string> RandomFortuneAsync()
{
_logger?.LogInformation("RandomFortuneAsync");
var client = GetClient();
return await client.GetStringAsync(RANDOM_FORTUNE_URL); } private HttpClient GetClient()
{
var client = new HttpClient(_handler, false);
return client;
}
}

接下来,最重要的步骤,在程序全局文件Global.asax中进行依赖注入的配置,这里引用到的Autofac扩展库也是有区别:

MVC直接引用Autofac即可

WebAPI引用的是Autofac.WebApi2

webForm引用的是Autofac.Web

这里主要写下 webForm的配置代码:

 public class Global : System.Web.HttpApplication, IContainerProviderAccessor
{
// 持有应用程序容器的提供程序
static IContainerProvider _containerProvider; //将被`Autofac HttpModules`用来解析和注入依赖关系的实例属性。
public IContainerProvider ContainerProvider
{
get { return _containerProvider; }
} protected void Application_Start(object sender, EventArgs e)
{
ApplicationConfig.RegisterConfig("development");
//var config = GlobalConfiguration.Configuration;
var builder = new ContainerBuilder(); // Add Microsoft Options to container
builder.RegisterOptions(); // Add Microsoft Logging to container
builder.RegisterLogging(ApplicationConfig.Configuration); // Add Console logger to container
builder.RegisterConsoleLogging(); //// Register all the controllers with Autofac
builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly()); // Register IDiscoveryClient, etc.
builder.RegisterDiscoveryClient(ApplicationConfig.Configuration); // Register FortuneService builder.RegisterType<FetchServise>().As<IFetchServise>();//MVC,webAPI也是这么写 // Create the Autofac container
var container = builder.Build(); _containerProvider = new ContainerProvider(container); //config.DependencyResolver = new AutofacWebApiDependencyResolver(container);//WebAPI创建容器
//DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//MVC创建容器 container.StartDiscoveryClient(); } protected void Session_Start(object sender, EventArgs e)
{ } protected void Application_BeginRequest(object sender, EventArgs e)
{ } protected void Application_AuthenticateRequest(object sender, EventArgs e)
{ } protected void Application_Error(object sender, EventArgs e)
{ } protected void Session_End(object sender, EventArgs e)
{ } protected void Application_End(object sender, EventArgs e)
{ }
}

  

 然后在Page代码页中依赖注入实现我们自定义的接口方法:

 public partial class WebForm2 : System.Web.UI.Page
{
public IFetchServise fetch { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
this.Page.RegisterAsyncTask(new PageAsyncTask(GetName));
} private async Task GetName()
{
Label1.Text = await fetch.RandomFortuneAsync();
}
}

  

 

.net MVC, webAPI,webForm集成steeltoe+springcloud实现调用服务中心服务的总结的更多相关文章

  1. 线上SpringCloud网关调用微服务跨机房了,咋整?

    1.前言 公司内考虑到服务器资源成本的问题,目前业务上还在进行服务的容器化改造和迁移,计划将容器化后的服务,以及一些中间件(MQ.DB.ES.Redis等)尽量都迁移到其他机房. 那你们为什么不用阿里 ...

  2. .net framework 4.5 +steeltoe+ springcloud(二) 实现服务发现与调用功能

    首先,写一个简单的可被调用的服务注册到服务中心,我们这命名为java-service,用的是IDEA创建一个spring boot项目,选择spring client类型. 修改application ...

  3. Mvc与WebForm优缺点及Mvc的使用

    关于Mvc与WebForm的优缺点在网上的评论可谓不胜枚举,但脱离了我们的项目来谈这些意义就不大了.以我们这次改版来看,WebForm的优势有以下几点: 一,可以使用<#include>, ...

  4. Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记

    2016年,.net 会有很多大更新 ASP.NET 5 在此之前我都是用着古老的.net做开发的 (WebForm + IIS) 为了接下来应对 .net 的新功能,我特地去学习了一下基本的 MVC ...

  5. MVC WebApi 用户验证 (2)

    构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)   前言: 构建ASP.NET MVC5+EF6+E ...

  6. 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)

    前言: 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(65)-MVC WebApi 用户验证 (1) 回顾上一节,我们利用webapi简单的登录并 ...

  7. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目

    ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)   我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...

  8. Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行(含系列目录)。

    前言: Taurus.MVC 微服务版本已经发布了:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单. 以前都是框架发布时写点相关功能点的文章,没有形成 ...

  9. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

随机推荐

  1. [Selenium Grid] 搭建Hub和Node环境

    Note : 先在Hub和Node的机器上安装好JDK,  IE浏览器,Chrome浏览器,Firefox浏览器 准备好红色框标示的东西: Hub.bat :启动Hub AllNodes.bat  : ...

  2. 商业化博客平台原型制作分享-TypePad

    TypePad是商业化博客平台,提供完全付费的博客服务,通过TypePad用户可以很容易建立自己的博客,TypePad提供博客系统该有的所有功能以及多种设计风格和外观,如果用户熟悉HTML和CSS,完 ...

  3. js 正则表达式,匹配邮箱/手机号/用户名

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. Silverlight保存大数据到WCF出现Not Found问题

    Silveright调用WCF保存大数据时,直接在客户端报“ 远程服务器返回了错误:Not Found ”问题,少量是没问题,如下图: 后面在这个文章中找到解决办法: http://www.cnblo ...

  5. Windows-universal-samples学习笔记系列五:Custom user interactions

    Custom user interactions Basic input Complex inking Inking Low latency input Simple inking Touch key ...

  6. 811. Subdomain Visit Count

    这题主要难在构建关联容器,方法很多,但是核心都是把原字符串一截一截减下来处理,先把前面用空格隔开的次数转化为整数,然后处理后面的多层子域. 方法一,查找标志字符,用标志字符把字符串分成几段 stati ...

  7. 671. Second Minimum Node In a Binary Tree

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  8. spring cloud 组件图

    spring cloud 提供了一套微服务的框架. 上图就是微服务一些常用的组件. 1.EureKa 实现服务的注册和发现. 2.Ribbon 实现服务的调用(客户端实现负载均衡) 3.Feign 实 ...

  9. (6)How language shapes the way we think

    https://www.ted.com/talks/lera_boroditsky_how_language_shapes_the_way_we_think/transcript 00:12So, I ...

  10. c语言struct和c++struct的区别

    1.定义 c语言中struct是用户自定义数据类型(UDT),是一些变量的集合体:c++中struct是抽象数据类型(ADT),能给用户提供接口,能定义成员函数,能继承,能实现多态 2.成员权限设置 ...