wcf怎么使用构造函数进行依赖注入

作者&投稿:驷窦 (若有异议请与网页底部的电邮联系)
如何给WCF添加自定义构造函数~

在WCF的服务里面,不支持带参数的构造函数。另外当你给了一个带参数的构造函数,就不会自动添加一个无参的构造函数了,而无参构造函数是必须的,因此最终编译就报错。

其实要达到你的目的,非常简单,你只要将需要设置的变量定义为全局的静态变量,在外部设置好,这样服务类内部就可以访问了。

如果我们想进行依赖注入,首先我们需要知道依赖是什么。简而言之,在我们的代码中,依赖就是两个模块间的一种关联(在 Java 即指两个类)--往往是其中的一个模块使用另外一个模块去做些事情。

步骤如下:
一、实现IInstanceProvider接口 - IocInstanceProvider

1. 新建一个类IocInstanceProvider,实现IInstanceProvider接口。

2. 实现IInstanceProvider接口的三个方法,并引入你自己的IoC容器(比如我们用的是CNBlogs.Infrastructure.CrossCutting.IoC),也就是让WCF通过你的IoC容器获取WCF服务的实例。示例代码如下:

public class IocInstanceProvider : IInstanceProvider
{
Type _serviceType;
IContainer _container;

public IocInstanceProvider(Type serviceType)
{
_serviceType = serviceType;
_container = CNBlogs.Infrastructure.CrossCutting.IoC.
IoCFactory.Instance.CurrentContainter;
}

#region IInstanceProvider Members

public object GetInstance(InstanceContext instanceContext, Message message)
{
return _container.Resolve(_serviceType);
}

public object GetInstance(InstanceContext instanceContext)
{
return GetInstance(instanceContext, null);
}

public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
if (instance is IDisposable)
((IDisposable)instance).Dispose();
}

#endregion
}

注:你的IoC容器要事先注入了相应的WCF服务的实例。比如我们的注入:

container.RegisterType<IBlogService, BlogService>();

其中IBlogService是WCF服务接口,BlogService是WCF服务实现。

二、实现IServiceBehavior接口 - IocServiceBehavior

1. 新建一个类IocServiceBehavior,继承自Attribute,实现IServiceBehavior

public class IocServiceBehavior : Attribute, IServiceBehavior

2. 实现IServiceBehavior的AddBindingParameters()方法,并引入之前创建的IocInstanceProvider

public class IocServiceBehavior : Attribute, IServiceBehavior
{
#region IServiceBehavior Members

public void AddBindingParameters(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase,
Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters)
{
foreach (var item in serviceHostBase.ChannelDispatchers)
{
var dispatcher = item as ChannelDispatcher;
if (dispatcher != null)
{
dispatcher.Endpoints.ToList().ForEach(endpoint =>
{
endpoint.DispatchRuntime.InstanceProvider = new
IocInstanceProvider(serviceDescription.ServiceType);
});
}
}
}

public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
}

public void Validate(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
}

#endregion
}

三、在WCF服务实现类上增加[IocServiceBehavior]属性

代码如下:

[IocServiceBehavior]
public class BlogService : IBlogService
{
private IBlogSiteService _blogSiteService;

public BlogService(IBlogSiteService blogSiteService)
{
_blogSiteService = blogSiteService;
}

#region IBlogService Members

public BlogSiteDto GetBlogSiteWithPosts(int blogId,
bool withPostBody, int itemcount)
{
return _blogSiteService.GetWithPosts(blogId,
withPostBody, itemcount);
}

#endregion
}

搞定!是不是很轻松!

上面的实现代码参考自Domain Oriented N-Layered .NET 4.0 Sample App(http://microsoftnlayerapp.codeplex.com/),如果你对DDD感兴趣,推荐阅读这个项目的代码。

代码改进

根据Artech的建议,并参考WCF Extensibility – IInstanceProvider,改进一下IocServiceBehavior的代码,实现ApplyDispatchBehavior接口,代码如下:

public class IocServiceBehavior : Attribute, IServiceBehavior
{
#region IServiceBehavior Members

public void AddBindingParameters(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase,
Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters)
{
}

public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
{
foreach (EndpointDispatcher ed in cd.Endpoints)
{
if (!ed.IsSystemEndpoint)
{
ed.DispatchRuntime.InstanceProvider =
new IocInstanceProvider(serviceDescription.ServiceType);
}
}
}
}

public void Validate(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
}

#endregion
}

new ServiceHost(...) 的时候,除了传递typeof(...) , 还可以将你的接口实现的类的实例(你的服务实例)传递进去,可以在此时传递参数,传递接口。
注意同时需要在ServiceBehavior里将 InstanceContextMode 设置成 InstanceContextMode.Single单例模式。


Structure(构造函式)详细资料大全
用户定义的值类型。与类相似,结构可以包含构造函式、常数、栏位、方法、属性、索引器、运算符和嵌套类型。基本介绍 外文名 :Structure Structure :用户定义的值类型 结构 :构造函式 不同 :与类不同的是,结构不支持继承 Structure —结构 但是,与类不同的是,结构不支持继承。另...

构造函数一般用哪些地方
构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。在下面的示例中,定义了一个具有一个简单的构造函数,名为 Taxi 的类。然后使用 new 运算符来实例化该类。在为新对象分配内存之后,new 运算符立即调用 Taxi 构造函数。public class Taxi...

构造函数作用是什么
构造函数的作用是在创建对象时进行初始化工作,最常见的就是对成员变量赋值。构造函数是一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户调用,而是在创建对象时自动执行。构造函数的作用就是用来实例化的,打个比方:就是将画在图纸上的高楼模型变成真实的建筑。在这个例子中this指的...

构造函数和析构函数
类构造函数 本节将讨论三种类构造函数 类构造函数的类型 注释 实例 用于创建并初始化类的实例 私有 在类之外不可访问的特殊类型实例构造函数 无法用私有构造函数来实例化类 静态 在创建第一个实例或引用任何静态成员之前 将自动调用这种构造函数来初始化类 无法直接调用这种构造函数 备注 ( ) 实例...

构造函数主要作用是什么
拷贝构造函数,经常被称作X(X&),是一种特殊的构造函数,他由编译器调用来完成一些基于同一类的其他对象的构件及初始化。它的唯一的一个参数(对象的引用)是不可变的(因为是const型的)。这个函数经常用在函数调用期间于用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数...

构造函数的八种方法
5.构造函数+原型的组合 使用方式:自定义构造函数,属性在函数中初始化,方法添加到原型上 适用场景:需要创建多个类型确定的对象 6.动态原型模式 动态原型函数模式把所有信息都封装在了构造函数中,在构造函数中初始化原型,又保持了同时使用构造函数和原型的优点。如果不用if判断的方式直接在原型上添加...

Js创建对象额几种方式
后者称之为混合工厂方式),不推荐使用new的方式使用该对象 3.在函数的最后返回该对象 4.不推荐使用这种方式创建对象,但应该了解。缺点:①无法确定对象的类型(因为都是Object)。②创建的多个对象之间没有关联。第二种模式:构造函数方式说明: 1.与工厂方式相比,使用构造函数方式创建对象,无需再函...

关于构造函数的几个问题
weight=ww; high=1;width=w; length=h;} void setWeight(int w){ weight=w; } private:int weight, length, width, high;};void main(){ Desk d(2,3,3,5);\/\/Desk a[10]; \/\/Q1.这个为什么错了?---因为你的默认构造函数是私有的 Desk *pb; \/\/没错是因为只是定义了一...

简述构造方法和普通的成员方法有什么区别
构造方法和普通的成员方法最大的区别是,他们所使用的一个方式和涉及到的主要范围会有所不一样,所以使用的时候一定要注意。

构造函数和构造方法是同一概念吗?
是同一概念。构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。构造函数的函数名和类名一致,默认的构造函数没有参数,没有返回值,构造函数的函数体内,没有内容。

琅琊区13829017424: 注解如何依赖注入有参构造函数的类对象 -
戎伏金磬: 首先你这个说法是错误的!!spring通过IOC的核心容器去管理对象时需要在spring容器中,声明bean组件然后就会被spring容器管理,然后可以在这个bean中引入其他bean.而属性注入的方法是正对引入的bean而言的,我了解的方法有很多种...

琅琊区13829017424: 如何实现在controller中用构造函数注入,而不是属性注入 -
戎伏金磬: 如何实现 在Controller 中 用属性注入,而不是构造函数注入呢,类似下面的代码. public class HomeController : BaseController{private IUserRepository urep { get; set; } public ActionResult Index(){var cc1 = urep.GetList();return View(cc1);}

琅琊区13829017424: spring依赖除了(set注入,构造方法注入)还有哪种注入方式? -
戎伏金磬: 除了属性注入(set),和构造注入(constractor),还有工厂注入.工厂注入具体有分为动态工厂注入和静态工厂注入,具体操作时在bean标签上有factory-method属性写你的工厂方法,静态工厂与动态工厂的差别就不说了,还有一种就是也是属性注入的情况,spring或者是其他和spring配合的框架提供了一系列Aware接口让你直接使用的

琅琊区13829017424: Spring依赖注入是不是分为手动注入和自动装配,还是依赖注入就是手动注入 -
戎伏金磬: 哎...貌似不是这么分的,可以理解成全是手动的. 基本就3种方式 setter 构造函数 注解(约等于setter) Spring Team推荐使用 构造函数+注解的方式,以下是IDEA的提示 说的是这样的代码 改成这样 原因是 构造方法会先执行,之后执行@Autowired,在你的构造方法里是有报错的可能的(比如你在构造方法里调用了@Autowired注解对象的方法,可是@Autowired的对象还是null呢).

琅琊区13829017424: 请问下依赖注入的三种方式的区别 -
戎伏金磬: Type1 接口注入 我们常常借助接口来将调用者与实现者分离.如: public class ClassA { private InterfaceB clzB; public init() { Ojbect obj = Class.forName(Config.BImplementation).newInstance(); clzB = (InterfaceB)obj; } …… } 上面的代码中,...

琅琊区13829017424: 依赖注入是怎么回事 -
戎伏金磬: 依赖注入和控制反转是同义词,已合并.控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题. 控制反转还有一个名字叫做依赖注入(Dependency Injection).简称DI.起源早在...

琅琊区13829017424: c++构造函数怎么使用? -
戎伏金磬: 默认是无参数构造函数, 当你想在构造的时候传参数进去, 那么自己就要写个有参数的构造函数; 例如: class A1{ //使用默认构造函数,无参数 } class A2{ A2(int c){ m_c=c } //有参数构造函数, 可以传达一个值初始化成员变量 int m_c; } 调用: A1 a1; //默认构造函数, 无参数 A2 a2(10); //有参数构造函数, 传达参数10,初始化成员变量 a2.m_c;

琅琊区13829017424: c++中拷贝构造函数的用法? -
戎伏金磬: 1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了.(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数.百度百科上是这样说的:拷贝构造函数,是一种特殊的构...

琅琊区13829017424: 控制反转和依赖注入的区别 -
戎伏金磬: 依赖注入IOC技术现在很流行,主要是spring带动起来的,IOC最典型的应用就是控制反转DI. 大致意思就是减少类间耦合度,避免用new来创建对象.

琅琊区13829017424: WCF 服务实现的类 是否能用构造函数 -
戎伏金磬: 您好:1、如果你使用WCF,这是一个服务,理论上来说,客户端不应该知道数据库在哪儿.2、就算你想要实现多种不同的数据库连接可更改,通常的方法也是在服务端做一个配置器,可以通...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网