1.新建一个项目

2.要对WCF服务实现Autofac注入,需要实现2个接口,IInstanceProvider与IServiceBehavior,并让实现IServiceBehavior的类成为一个Attribute(继承自Attribute),然后加在WCF服务实现类上,就可以实现WCF的构造函数依赖注入。

首先现接口IServiceBehavior,新建一个类IocServiceBehavior

  1. namespace XiaoYaoDiJun_WCF_Template.IOC
  2. {
  3. public class IocServiceBehavior : Attribute, IServiceBehavior
  4. {
  5. public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
  6. {
  7. }
  8.  
  9. public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints,
  10. BindingParameterCollection bindingParameters)
  11. {
  12. if(serviceHostBase.State== CommunicationState.Opened)return;//第一次进入时State是Opening。第二次进入时State是opened,如果继续往下走,程序就会出错
  13. foreach (var item in serviceHostBase.ChannelDispatchers)
  14. {
  15. var dispatcher = item as ChannelDispatcher;
  16. if (dispatcher != null)
  17. {
  18. foreach (var it in dispatcher.Endpoints)
  19. {
  20. it.DispatchRuntime.InstanceProvider = new
  21. IocInstanceProvider(serviceDescription.ServiceType);
  22. }
  23. }
  24. }
  25. }
  26.  
  27. public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
  28. {
  29.  
  30. }
  31. }
  32. }

首先现接口IInstanceProvider,新建一个类IocInstanceProvider

  1. namespace XiaoYaoDiJun_WCF_Template.IOC
  2. {
  3. public class IocInstanceProvider : IInstanceProvider
  4. {
  5. Type serviceType;
  6. IContainer container;
  7. public IocInstanceProvider(Type _serviceType)
  8. {
  9. try
  10. {
  11. serviceType = _serviceType;
  12. var build = new ContainerBuilder();
  13. //注册wcf服务,Test_Template服务名称
  14. build.RegisterType(typeof(Test_Template));
  15. //注册接口
  16. RegisterBuilder(build);
  17.  
  18. container = build.Build();
  19. }
  20. catch (Exception ex)
  21. {
  22. Console.WriteLine(ex.Message);
  23. }
  24.  
  25. }
  26. //对业务逻辑层进行注册
  27. private void RegisterBuilder(ContainerBuilder build)
  28. {
  29. build.RegisterType<TestBll>().As<ITestBll>();
  30. }
  31.  
  32. public object GetInstance(InstanceContext instanceContext)
  33. {
  34. return GetInstance(instanceContext, null);
  35. }
  36.  
  37. public object GetInstance(InstanceContext instanceContext, Message message)
  38. {
  39. return container.Resolve(serviceType);
  40. }
  41.  
  42. public void ReleaseInstance(InstanceContext instanceContext, object instance)
  43. {
  44. if (instance is IDisposable)
  45. ((IDisposable)instance).Dispose();
  46. }
  47. }
  48. }

3.控制台启动方式,此时不需要在服务类中写启动方法

  1. namespace XiaoYaoDiJun_WCF_Template
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. try
  8. {
  9. var host = new ServiceHost(typeof(Test_Template));
  10. host.Open();
  11. Console.WriteLine("服务已经开启");
  12. Console.ReadKey();
  13. }
  14. catch (Exception ex)
  15. {
  16. Console.WriteLine(ex.Message);
  17. }
  18. }
  19. }
  20. }

4.windows服务启动方式,此时需要在服务类中写启动方法

  1. partial class Wcf_ProjectService : ServiceBase
  2. {
  3. public Wcf_ProjectService()
  4. {
  5. InitializeComponent();
  6. }
  7.  
  8. private ServiceHost host = null;
  9. protected override void OnStart(string[] args)
  10. {
  11. if (host != null) return;
  12. host = new ServiceHost(typeof(Test_Template));
  13. host.Open();
  14. }
  15.  
  16. protected override void OnStop()
  17. {
  18. if(host.State!=CommunicationState.Closed)host.Close();
  19. }
  20. }
  1. namespace XiaoYaoDiJun_WCF_Template
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. try
  8. {
  9. //Wcf_ProjectService服务名称
  10. var serviceToRun = new ServiceBase[] {new Wcf_ProjectService() };
  11. ServiceBase.Run(serviceToRun);
  12. }
  13. catch (Exception ex)
  14. {
  15. Console.WriteLine(ex.Message);
  16. }
  17. }
  18. }
  19. }

2种方式都可以启动服务!

参考文章:轻松实现WCF服务的构造函数依赖注入

Autofac 解释第一个例子 《第一篇》

Autofac 组件、服务、自动装配 《第二篇》

通过配置的方式Autofac 《第三篇》

WCF+Autofac 实现构造函数依赖注入的更多相关文章

  1. laravel中的构造函数依赖注入理解

    laravel中的自动依赖注入是非常强大的,刚开始会疑惑为什么只要在构造函数中传入一个强制类型的变量(就是参数有类型限制)过去就行了? 通过查看源码即查阅资料发现其实这其中有一个php技术,就是反射技 ...

  2. WebAPI2使用Autofac实现IOC属性注入完美解决方案

    一.前言 只要你是.NETer你一定IOC,IOC里面你也会一定知道Autofac,上次说了在MVC5实现属性注入,今天实现在WebApi2实现属性注入,顺便说一下autofac的程序集的注入方式,都 ...

  3. .NET领域最为流行的IOC框架之一Autofac WebAPI2使用Autofac实现IOC属性注入完美解决方案 AutoFac容器初步

    .NET领域最为流行的IOC框架之一Autofac   一.前言 Autofac是.NET领域最为流行的IOC框架之一,微软的Orchad开源程序使用的就是Autofac,Nopcommerce开源程 ...

  4. AutoFac IoC DI 依赖注入

    AutoFac IoC DI 依赖注入 记录点点滴滴知识,为了更好的服务后来者! 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌 ...

  5. AutoFac实现WebAPI依赖注入(EF以及Mysql)

    什么是依赖注入? 我们以实际的例子来加以介绍 实体如下 public class Product { public int ID { get; set; } public string Name { ...

  6. ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便

    初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的.这是因为其使用了依赖注入 (DI) 的软件设计模式,代码的设计是遵循着“高内聚.低耦合”的原则, ...

  7. ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便(转载)

    原文地址:https://www.cnblogs.com/Andre/p/9604759.html 初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通 ...

  8. Autofac中的属性注入功能使用

    使用依赖注入容器时,大部分都是使用构造函数来注入或者是xml配置文件.也有很多支持属性注入.Autofac就是其中一个. 1 为什么要有属性注入? 对于一些使用特频繁的类或者方法,很多类都会用到,那么 ...

  9. 【转】scapy 构造以太网注入帧

    1. 描述 使用scapy进行以太网帧的注入,相对于RAW_SOCKET还是比较简单的.在讲述packet注入之前,先了解一下scapy伪造以太网帧的相关知识.下图为以太网帧格式和scapy对应的封装 ...

随机推荐

  1. 论文笔记:Joint Embeddings of Shapes and Images via CNN Image Purification

    今天分享的这篇论文是 SIGGRAPH 2015 的入选论文,标题比较长,但它做的事情其实很简单:通过一张图片,找到和这张图片最相似的 3D 形状

  2. Contains Duplicate I & III

    Contains Duplicate I Given an array of integers, find if the array contains any duplicates. Your fun ...

  3. vue之递归组件实现树形目录

    递归组件的应用===>可以通过组件命名来自己使用自己的组件 实例如下 父组件 <div class="content"> <detail-list :lis ...

  4. smarty半小时快速上手教程

    一:smarty的程序设计部分: 在smarty的模板设计部分我简单的把smarty在模板中的一些常用设置做了简单的介绍,这一节主要来介绍一下如何在smarty中开始我们程序设计.下载Smarty文件 ...

  5. LaTeX公式中的空格

    两个quad空格 a \qquad b 两个m的宽度 quad空格 a \quad b 一个m的宽度 大空格 a\ b 1/3m宽度 中等空格 a\;b 2/7m宽度 小空格 a\,b 1/6m宽度 ...

  6. List<T>常用操作

    1.List<T>类型强制转换: List<UIData> datalist=null;datalist.ConvertAll<object>(input => ...

  7. ASP.NET MVC5入门2之Ajax实现数据查询

    开发环境:VS2013 数据库:SQL Server2008R2 架构:ASP.NET MVC5 开发语言:C# 代码下载链接:http://download.csdn.net/detail/u010 ...

  8. ElasticSearch搜索数据到底有几种方式?

    Elasticsearch允许三种方式执行搜索请求: GET请求正文: curl -XGET "http://localhost:9200/app/users/_search" - ...

  9. 大数据python词频统计之本地分发-file

    统计某几个词在文章出现的次数 -file参数分发,是从客户端分发到各个执行mapreduce端的机器上 1.找一篇文章The_Man_of_Property.txt如下: He was proud o ...

  10. STM32L476应用开发之五:数据保存与SD卡操作

    便携式气体分析仪的特点就是离线运行.尽管是离线运行,但测试数据还是需要的,所以采取方式保存数据就是必须的.在本次项目中我们计划采用SD卡来保存数据. 1.硬件设计 该读卡器整合 SD 卡规范和 FAT ...