WCF+Autofac 实现构造函数依赖注入
1.新建一个项目

2.要对WCF服务实现Autofac注入,需要实现2个接口,IInstanceProvider与IServiceBehavior,并让实现IServiceBehavior的类成为一个Attribute(继承自Attribute),然后加在WCF服务实现类上,就可以实现WCF的构造函数依赖注入。
首先现接口IServiceBehavior,新建一个类IocServiceBehavior
namespace XiaoYaoDiJun_WCF_Template.IOC
{
public class IocServiceBehavior : Attribute, IServiceBehavior
{
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
} public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters)
{
if(serviceHostBase.State== CommunicationState.Opened)return;//第一次进入时State是Opening。第二次进入时State是opened,如果继续往下走,程序就会出错
foreach (var item in serviceHostBase.ChannelDispatchers)
{
var dispatcher = item as ChannelDispatcher;
if (dispatcher != null)
{
foreach (var it in dispatcher.Endpoints)
{
it.DispatchRuntime.InstanceProvider = new
IocInstanceProvider(serviceDescription.ServiceType);
}
}
}
} public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{ }
}
}
首先现接口IInstanceProvider,新建一个类IocInstanceProvider
namespace XiaoYaoDiJun_WCF_Template.IOC
{
public class IocInstanceProvider : IInstanceProvider
{
Type serviceType;
IContainer container;
public IocInstanceProvider(Type _serviceType)
{
try
{
serviceType = _serviceType;
var build = new ContainerBuilder();
//注册wcf服务,Test_Template服务名称
build.RegisterType(typeof(Test_Template));
//注册接口
RegisterBuilder(build); container = build.Build();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} }
//对业务逻辑层进行注册
private void RegisterBuilder(ContainerBuilder build)
{
build.RegisterType<TestBll>().As<ITestBll>();
} public object GetInstance(InstanceContext instanceContext)
{
return GetInstance(instanceContext, null);
} public object GetInstance(InstanceContext instanceContext, Message message)
{
return container.Resolve(serviceType);
} public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
if (instance is IDisposable)
((IDisposable)instance).Dispose();
}
}
}
3.控制台启动方式,此时不需要在服务类中写启动方法
namespace XiaoYaoDiJun_WCF_Template
{
class Program
{
static void Main(string[] args)
{
try
{
var host = new ServiceHost(typeof(Test_Template));
host.Open();
Console.WriteLine("服务已经开启");
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
4.windows服务启动方式,此时需要在服务类中写启动方法
partial class Wcf_ProjectService : ServiceBase
{
public Wcf_ProjectService()
{
InitializeComponent();
} private ServiceHost host = null;
protected override void OnStart(string[] args)
{
if (host != null) return;
host = new ServiceHost(typeof(Test_Template));
host.Open();
} protected override void OnStop()
{
if(host.State!=CommunicationState.Closed)host.Close();
}
}
namespace XiaoYaoDiJun_WCF_Template
{
class Program
{
static void Main(string[] args)
{
try
{
//Wcf_ProjectService服务名称
var serviceToRun = new ServiceBase[] {new Wcf_ProjectService() };
ServiceBase.Run(serviceToRun);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
2种方式都可以启动服务!
参考文章:轻松实现WCF服务的构造函数依赖注入
WCF+Autofac 实现构造函数依赖注入的更多相关文章
- laravel中的构造函数依赖注入理解
laravel中的自动依赖注入是非常强大的,刚开始会疑惑为什么只要在构造函数中传入一个强制类型的变量(就是参数有类型限制)过去就行了? 通过查看源码即查阅资料发现其实这其中有一个php技术,就是反射技 ...
- WebAPI2使用Autofac实现IOC属性注入完美解决方案
一.前言 只要你是.NETer你一定IOC,IOC里面你也会一定知道Autofac,上次说了在MVC5实现属性注入,今天实现在WebApi2实现属性注入,顺便说一下autofac的程序集的注入方式,都 ...
- .NET领域最为流行的IOC框架之一Autofac WebAPI2使用Autofac实现IOC属性注入完美解决方案 AutoFac容器初步
.NET领域最为流行的IOC框架之一Autofac 一.前言 Autofac是.NET领域最为流行的IOC框架之一,微软的Orchad开源程序使用的就是Autofac,Nopcommerce开源程 ...
- AutoFac IoC DI 依赖注入
AutoFac IoC DI 依赖注入 记录点点滴滴知识,为了更好的服务后来者! 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌 ...
- AutoFac实现WebAPI依赖注入(EF以及Mysql)
什么是依赖注入? 我们以实际的例子来加以介绍 实体如下 public class Product { public int ID { get; set; } public string Name { ...
- ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便
初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的.这是因为其使用了依赖注入 (DI) 的软件设计模式,代码的设计是遵循着“高内聚.低耦合”的原则, ...
- ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便(转载)
原文地址:https://www.cnblogs.com/Andre/p/9604759.html 初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通 ...
- Autofac中的属性注入功能使用
使用依赖注入容器时,大部分都是使用构造函数来注入或者是xml配置文件.也有很多支持属性注入.Autofac就是其中一个. 1 为什么要有属性注入? 对于一些使用特频繁的类或者方法,很多类都会用到,那么 ...
- 【转】scapy 构造以太网注入帧
1. 描述 使用scapy进行以太网帧的注入,相对于RAW_SOCKET还是比较简单的.在讲述packet注入之前,先了解一下scapy伪造以太网帧的相关知识.下图为以太网帧格式和scapy对应的封装 ...
随机推荐
- 统计分析与R软件-chapter2-4
2.4 因子 统计中的变量有几中重要类别:区间变量.名义变量和有序变量.区间变量取连续的数值,可以进行求和.平均值等运算.名义变量和有序变量取离散值,可以用数值代表,也可以是字符型值,其具体数值没有加 ...
- 【转】实习小记-python 内置函数__eq__函数引发的探索
[转]实习小记-python 内置函数__eq__函数引发的探索 乱写__eq__会发生啥?请看代码.. >>> class A: ... def __eq__(self, othe ...
- MongoDB 和 NoSQL简介
MongoDB 是一个基于分布式文件存储的数据库( https://www.mongodb.com/ ).由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案.MongoDB ...
- java虚拟机的堆内存配置
官网文档地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html 接录如下: -XX:MaxHeapSize=si ...
- sumafan:python爬虫多线程爬取数据小练习(附答案)
抓取 https://www.cnbeta.com/ 首页中新闻内容页网址, 抓取内容例子: https://hot.cnbeta.com/articles/game/825125 将抓取下来的内容页 ...
- 洛谷 P4948 拉格朗日多项式插值(杜老师板子)
https://www.luogu.org/problemnew/show/P4948 这篇博客主要目的是存一下的dls的神奇板子,本来应该是推公式或者二分做的 但是dls的插值板子直接写好了这个特殊 ...
- .net 项目与网站区别
背景 .net 的又一个杰作,我作为资深开发人员,好久没搞明白两者关系,后来慢慢总算琢磨明白了.在2003和2005的时候,都是用的网站方式,后来见到某同事用的项目方式,当时还很不理解,真是个傻瓜程序 ...
- web-font 个人学习小总结
个人觉得 web-font 分为两种: 第一种就是真正文本字体,客户端没有安装的字体通过远程加载字体来实现特殊字体提高用户体验: icodon.com : http://icodon.com/goo ...
- MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)
mysql致力于项目开发及数据库管理之间解耦合(帮忙封装一些数据处理方法,使应用程序的开发者可以专注于应用程序的开发),但受限于不同部门沟通的成本问题,现阶段直接使用的价值不大. 一.视图(只能sel ...
- ubuntu server 14.04 上安装jdk1.8
ubuntu server 14.04 上安装jdk1.8 1.使用apt-get安装oracle-jdk安装oracle jdk sudo apt-get install python-softwa ...